nhibernate - متغيرة - كيفية عمل قائمة منسدلة مفلترة




ASP.NET مفك 2 أرسي نموذج ملزم مع نهيبرنات والقوائم المنسدلة (2)

لقد استخدمت تقنيات مماثلة مع لينق إلى فئات سكل قبل مع أي مشاكل. لا أعتقد أنك بحاجة إلى نموذج مخصص لهذا الغرض. يجب أن يقوم أوبداتيموديل بتحديث فئة المنتج التي تمريرها إليها - وليس الفئة الفرعية الفئة المرفقة بها. تحقق من هتمل التي تم إنشاؤها بواسطة المساعد دروبدونليستفور. ما هو اسم العنصر؟ يجب أن يكون اسم حقل المفتاح الأجنبي في جدول المنتجات (على سبيل المثال "كاتيغورييد" أو "Product.CategoryID" وليس "category.Id"). إذا كان "category.Id" - حاول تغيير المعلمة الأولى من دروبدونليستفور إما "نموذج => model.Category" أو "نموذج => model.CategoryID" (أو أيا كان مجال المفتاح الخارجي هو). يجب أن يسبب هذا أوبداتيموديل فقط تحديث حقل مفتاح خارجي في فئة المنتج وليس فئة الفئة معرف.

لدي مشكلة مع نموذج ملزمة في بلدي ASP.NET مفك 2 أرسي التطبيق الذي يستخدم نهيبرنات للوصول إلى البيانات. نحن نحاول بناء التطبيق في روبي على القضبان طريقة ولها بنية بسيطة جدا حيث يتم استخدام كيانات المجال على طول الطريق من قاعدة البيانات إلى طريقة العرض.

التطبيق يحتوي على اثنين من كيانات المجال التي يمكن أن يتضح من قبل الفئتين التاليتين:

public class Product {
    ...

    public Category Category { get; set; }      
}

public class Category {
    public int Id { get; set; }
    public string Name { get; set; }
}

في طريقة العرض التي تجعل نموذج التعديل يحتوي على العبارة التالية لعرض قائمة منسدلة:

<%= Html.DropDownListFor(model => model.Category.Id, 
       new SelectList(ViewData["categories"] as IList<Category>, "Id", "Name"), 
       "-- Select Category --" ) %>

يرجى تجاهل استخدام بيانات العرض "غير المكتوبة" للاحتفاظ بمجموعة الفئات.

طريقة العمل التي تتلقى مشاركة النموذج مشابهة لما يلي. لاحظ أن السمة ترانزاكتيونفيلتر يضيف معالجة معاملة نهيبرنات ويلزم الصفقة إذا لم تحدث استثناءات والتحقق من صحة التحقق.

[HttpPost]
[TransactionFilter]
public ActionResult Edit(int id, FormCollection collection) {
    var product = _repository.Load(id);

    // Update the product except the Id
    UpdateModel(product, null, null, new[] {"Id"}, collection);

    if (ModelState.IsValid) {
      return RedirectToAction("Details", new {id});
    }
    return View(product);
}

مشكلتي هي أن يتم تعيين product.Category.Id مع القيمة المحددة في النموذج، على سبيل المثال category.Id = "2". استخدام الموثق النموذج الافتراضي ينتج في النوع التالي من استثناء نهيبرنات:

identifier of an instance of Name.Space.Entities.Category was altered from 4 to 2

هذا يجعل الكثير من المعنى لأن المنتج لديها بالفعل فئة المخصصة ويتم تغيير فقط المفتاح الأساسي من تلك الفئة الحالية. وكان ينبغي تعيين مثال آخر للفئة بدلا من ذلك.

أعتقد أنه يمكن إنشاء مخصص مودلبيندر للتعامل مع هذه المشكلة ولكن هناك طريقة أبسط لجعل هذا العمل؟ هل يمكن (وينبغي) تعديل كيانات النطاق للتعامل مع هذا؟


كان الحل الذي اخترناه في ذلك الوقت شيئا مماثلا لذلك:

TryUpdateModel(product, null, null, new[] {"Category"}, collection);
int categoryId;
if (int.TryParse(collection["Category.Id"], NumberStyles.Integer, CultureInfo.InvariantCulture, out categoryId) && categoryId > 0) {
    product.Category = _categoryRepository.Load(categoryId);
}
else {
    product.Category = null;
}

نحن ببساطة نقول الموثق نموذج لاستبعاد الملكية الجمعية والتعامل معها يدويا. ليست جميلة ولكن عملت في ذلك الوقت ....