2012-03-01 11 views
12

उम्मीद है कि एक बहुत ही सरल सवाल है। लेकिन मैं एक MVC अनुप्रयोग के साथ कोड का उपयोग कर पहली हूं और मुझे एक श्रेणी और ServiceType वस्तु कई रिश्ते के लिए कई है कि है:इकाई फ्रेमवर्क 4 मेरी कई से कई पंक्तियों को सहेज नहीं रहा

public class Category 
{ 
    public Category() 
    { 
     ServiceTypes = new HashSet<ServiceType>(); 
    } 

    public Guid CategoryId { get; set; } 

    [Required(ErrorMessage = "Name is required")] 
    public string Name { get; set; } 

    public virtual ICollection<ServiceType> ServiceTypes { get; set; } 
} 

डेटाबेस सही ढंग से तैयार की गई है और CategoryServiceTypes नामक एक जोड़ने तालिका में शामिल है। मेरा मुद्दा यह है कि मैं अपने सेवा प्रकार संग्रह में आइटम जोड़ता हूं और कॉल सहेजता हूं और हालांकि कोई त्रुटि नहीं होती है, श्रेणी सेवा प्रकार में कोई पंक्तियां नहीं जोड़े जाती हैं। मुझे आशा है कि मैं कुछ स्पष्ट रूप से गलत यहाँ कर रहा हूँ

[HttpPost] 
    public ActionResult Edit(Category category, Guid[] serviceTypeIds) 
    { 
     if (ModelState.IsValid) 
     { 
      // Clear existing ServiceTypes 
      category.ServiceTypes.Clear(); 

      // Add checked ServiceTypes 
      foreach (Guid serviceType in serviceTypeIds) 
      { 
       ServiceType st = db.ServiceTypes.Find(serviceType); 
       category.ServiceTypes.Add(st); 
      } 

      db.Entry(category).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(category); 
    } 

: नीचे कोड SaveChanges को category.ServiceTypes पर गणना 1 होगी हो जाता है, तो कुछ संग्रह में निश्चित रूप से है। कोई विचार?

धन्यवाद।

संपादित करें:

हालांकि नीचे प्रतिक्रिया वास्तव में सही जवाब मुझे लगता है मैं पोस्ट संपादित करें विधि के निम्नलिखित अंतिम संस्करण जोड़ना होगा सोचा है:

[HttpPost] 
    public ActionResult Edit(Category category, Guid[] serviceTypeIds) 
    { 
     if (ModelState.IsValid) 
     { 
      // Must set to modified or adding child records does not set to modified 
      db.Entry(category).State = EntityState.Modified; 

      // Force loading of ServiceTypes collection due to lazy loading 
      db.Entry(category).Collection(st => st.ServiceTypes).Load(); 

      // Clear existing ServiceTypes 
      category.ServiceTypes.Clear(); 

      // Set checked ServiceTypes 
      if (serviceTypeIds != null) 
      { 
       foreach (Guid serviceType in serviceTypeIds) 
       { 
        ServiceType st = db.ServiceTypes.Find(serviceType); 
        category.ServiceTypes.Add(st); 
       } 
      } 

      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(category); 
    } 

सूचना लाइन है कि की लोडिंग बलों सर्विस टाइप्स संग्रह, यह जरूरी है क्योंकि आलसी लोडिंग में उन बच्चों के सामान शामिल नहीं हैं, जिसका मतलब है कि सर्विस टाइप्स संग्रह को साफ़ करने से कुछ भी नहीं हुआ।

[HttpPost] 
public ActionResult Edit(Category category, Guid[] serviceTypeIds) 
{ 
    if (ModelState.IsValid) 
    { 
     // Clear existing ServiceTypes 
     category.ServiceTypes.Clear(); 
     db.Entry(category).State = EntityState.Modified; 
     // category attached now, state Modified 

     // Add checked ServiceTypes 
     foreach (Guid serviceType in serviceTypeIds) 
     { 
      ServiceType st = db.ServiceTypes.Find(serviceType); 
      // st attached now, state Unchanged 
      category.ServiceTypes.Add(st); 
      // EF will detect this as a change of category and create SQL 
      // to add rows to the link table when you call SaveChanges 
     } 

     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(category); 
} 

अपने कोड एफई में सूचना नहीं है कि आप servicetypes जोड़ लिया है क्योंकि आप के लिए श्रेणी देते हैं:

उत्तर

8

लाइन जहां पाश के सामने संदर्भ के लिए श्रेणी देते ले जाने की कोशिश संदर्भ जब servicetypes पहले से ही category.ServiceTypes संग्रह में हैं और सभी servicetypes पहले से ही Unchanged में संदर्भ से जुड़े हुए हैं।

+0

धन्यवाद स्लुमा, यह वास्तव में समस्या थी। – Gary

+0

हालांकि आपका उत्तर अब डेटाबेस में प्रविष्टियों को सही ढंग से सहेजता है, मुझे लगता है कि जब httppost विधि संपादित की जाती है, तो श्रेणी। सेवा प्रकार की गणना 0 है, भले ही संपादन प्रतिक्रिया विधि पर यह निश्चित रूप से 1 सहेजी गई सेवा प्रकार है। कोई विचार क्या कारण है? – Gary

+0

@ गैरी: यह एक एमवीसी मॉडलबिंडर समस्या होगी। मेरे लिए ऐसा लगता है कि इससे कोई फर्क नहीं पड़ता कि 'श्रेणी। सेवा प्रकार' में कुछ शामिल है क्योंकि आप जो भी काम कर रहे हैं वह वैसे भी उस सूची को साफ़ कर रहा है। महत्वपूर्ण केवल 'guid [] serviceTypeIds' संग्रह है क्योंकि आप उन आईडी का उपयोग करके' Find' के साथ डीबी से सर्विस टाइप टाइप कर रहे हैं और फिर लोड की गई इकाई के साथ सहयोग बनाते हैं। – Slauma

संबंधित मुद्दे