7

मैं इस दिन एक दिन की तरह निराश हूं ... कृपया मदद करें।एएसपी.नेट एमवीसी 3 ईएफ कोडफर्स्ट - डीबीसीएन्टेक्स्ट आइटम संपादन

मेरे पास एक चालान अनुभाग है जिसमें मैं JQuery का उपयोग करके डीओएम तत्वों को जोड़कर/हटाकर गतिशील रूप से नए आइटम जोड़ सकता हूं ... मैंने पहले ही यह पता लगाया है कि इन तत्वों को सही तरीके से कैसे नामित किया जाए ताकि वे परिणामस्वरूप और ठीक से मैप किए जाएं मॉडल और कार्रवाई पैरामीटर को भेजें।

तो चलो कहते हैं कि मैं प्रकार चालान

[HttpPost] 
public virtual ActionResult Edit(Invoice invoice) { 
    if (ModelState.IsValid) { 
     //code discussed below 
    } 
    return RedirectToAction("Index"); 
} 

चालान पैरामीटर सभी डेटा मैं चाहते हैं की परम के साथ संपादित बुलाया मेरी नियंत्रक में एक कार्रवाई डालते हैं। मुझे इसके साथ कोई समस्या नहीं है। ऑब्जेक्ट मॉडल निम्नलिखित है।

public class Invoice 
{ 
    [Key] 
    public int ID { get; set; } 
    public InvoiceType InvoiceType { get; set; } 
    public string Description { get; set; } 
    public int Amount { get; set; } 
    public virtual ICollection<InvoiceItem> InvoiceItems { get; set; } 
} 

नोट InvoiceItems संग्रह - इस डायनामिक रूप से सम्मिलित चालान मदों की एक संग्रह है। निम्नलिखित चालान Item मॉडल

[Table("InvoiceItems")] 
public class InvoiceItem 
{ 
    [Key] 
    public int ID { get; set; } 

    [ForeignKey("Invoice")] 
    public int InvoiceID { get; set; } 
    public Invoice Invoice { get; set; } 

    public string Description { get; set; } 
    public int Amount { get; set; } 
} 

और यही वह जगह है जहां मैं अटक गया हूं।

मैं इनवॉइस संग्रह चालान में आइटम को किसी भी मौके से डेटाबेस में सम्मिलित/अद्यतन नहीं कर सकता। मैं बहुत कुछ कर रहा हूं और मुझे ये समाधान मिल गए हैं - इनमें से कोई भी दुर्भाग्य से काम नहीं करता है।

समाधान # 1 - SetValues ​​के साथ कुछ अजीब कोड:

Invoice origInvoice = db.Invoices.Single(x => x.ID == invoice.ID); 
var entry = db.Entry(origInvoice); 
entry.OriginalValues.SetValues(invoice); 
entry.CurrentValues.SetValues(invoice); 
db.SaveChanges(); 

समाधान # 2 - मेरी DbContext करने के लिए एक नया अद्यतन विधि जोड़ने:

public void Update<T>(T entity) where T : class 
{ 
    this.Set<T>().Attach(entity); 
    base.ObjectContext.ObjectStateManager.ChangeObjectState(entity,System.Data.EntityState.Modified); 
} 

समाधान # 3 - http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and-entity-states.aspx

के अनुसार संदर्भ में मौजूदा लेकिन संशोधित इकाई को संदर्भित करना
db.Entry(invoice).State = EntityState.Modified; 
db.SaveChanges(); 

कैसे समाधान # 1 काम करता है: अपडेट नए जोड़े InvoiceItems को छोड़कर सभी गुण। SetValues ​​() ICollection संपत्ति को अनदेखा करता है। अगर मैं डीबी से पहले इस लाइन को जोड़ता हूं तो यह काम करेगा। सेव चेंज();

origEntry.Entity.InvoiceItems = invoice.InvoiceItems; 

... लेकिन मुझे विश्वास नहीं है कि यह बिल्कुल सही दृष्टिकोण है।

कैसे समाधान # 2 काम करता है: बिल्कुल काम नहीं करता है क्योंकि DbContext क्लास में कोई ऑब्जेक्ट कॉन्टेक्स्ट गुण नहीं है।

कैसे समाधान # 3 काम करता है: यह समाधान चालान को अपडेट करेगा लेकिन अन्यथा चालान इटम्स को अनदेखा करेगा।


अतिरिक्त जानकारी: निम्नलिखित है कि आइटम तत्व है जो InvoiceItem गुण पर मैप किए जाते उत्पन्न करने के लिए प्रयोग किया जाता है जावास्क्रिप्ट का टुकड़ा है।

window.InvoiceItemIndex++; 

    var str = $.tmpl("itemRowTmpl", { 
     itemIndexes: '<input type="hidden" name="Invoice.InvoiceItems.Index" value="' + window.InvoiceItemIndex + '"/> \ 
         <input type="hidden" name="Invoice.InvoiceItems[' + window.InvoiceItemIndex + '].ID" value="0"/>\ 
         <input type="hidden" name="Invoice.InvoiceItems[' + window.InvoiceItemIndex + '].InvoiceID" value="@Model.Invoice.ID"/>', 
     itemDescription: '<textarea cols="150" name="Invoice.InvoiceItems[' + window.InvoiceItemIndex + '].Description" rows="2"></textarea>', 
     itemAmount: '<input type="text" class="InvoiceItemAmount" style="text-align:right;" name="Invoice.InvoiceItems[' + window.InvoiceItemIndex + '].Amount" />', 
    }); 

अंतिम प्रश्न: मैं क्या गलत कर रहा हूं? डेटाबेस में स्वचालित रूप से डाले गए किसी अन्य मॉडल के संबंध में वस्तुओं का एक नया संग्रह रखने में क्या गलत है? जब माता-पिता मॉडल को सफलतापूर्वक अपडेट किया जाता है, तो इसे अनदेखा क्यों किया जा रहा है?

संपादित करें 1: सुधार

+0

जब आप कहते हैं कि "आइटम नहीं जोड़ सकते हैं", तो इसका क्या अर्थ है? क्या इसका मतलब है कि एक अपवाद उत्पन्न होता है? यदि हां, तो अपवाद क्या है? –

+0

हाँ क्या आप अपवाद पोस्ट कर सकते हैं? – Jack

उत्तर

6

DbEntityEntry.CurrentValues.SetValues केवल अदिश और जटिल गुण अद्यतन करता है। यह नेविगेशन गुणों की परवाह नहीं करता है। यही कारण है कि आपके InvoiceItems संग्रह में परिवर्तन डेटाबेस में नहीं लिखे गए हैं। Invoice से Modified की स्थिति को सेट करने के साथ एक ही समस्या है। यह केवल स्केलर और जटिल गुणों को संशोधित करता है लेकिन कोई नेविगेशन गुण नहीं है।

दुर्भाग्यवश ईएफ एक साधारण विधि प्रदान नहीं करता है जो आपके लिए विश्लेषण करेगा कि नेविगेशन संग्रह में कौन से आइटम जोड़े गए हैं, हटाए गए हैं या केवल डेटाबेस में मूल स्थिति की तुलना में संशोधित किए गए हैं, यदि परिवर्तन किए गए थे, जबकि संस्थाएं थीं एक संदर्भ से अलग (आपके उदाहरण में एक वेब पेज पर)।

इसका मतलब है कि आपको डेटाबेस में मूल स्थिति और नए बदले गए राज्य के बीच यह तुलना करना है।

कोड उदाहरण कैसे करना है कि उदाहरण के लिए यहाँ जवाब में हैं: The relationship could not be changed because one or more of the foreign-key properties is non-nullable उदाहरण अपनी स्थिति को बहुत अच्छी तरह से फिट है, बस InvoiceItems द्वारा Invoice और ChildItems द्वारा ParentItem बदलें।

आप कुछ दिनों पहले अतिरिक्त इंफोस के लिए इस प्रश्न को भी देख सकते हैं: WCF, Entity Framework 4.1 and Entity's State वास्तव में ऐसे कई अन्य प्रश्न हैं जो अलग-अलग ऑब्जेक्ट ग्राफ़ को अद्यतन करने के लिए समर्थन की कमी के समान समस्या से संबंधित हैं (जो एक है काफी आम परिदृश्य) इकाई फ्रेमवर्क की अधिक अप्रिय सीमाओं में से एक है।

(एक नोट: एक एमवीसी नियंत्रक में UpdateModel विधि है। मुझे यकीन नहीं है कि यह विधि एक पूर्ण ऑब्जेक्ट ग्राफ़ को अपडेट करने में सक्षम है (संग्रह में आइटम जोड़ें, हटाएं और बदलें)। व्यक्तिगत रूप से मैं नहीं करता हूं ' टी इसका उपयोग नहीं करते हैं, और यदि मैं इसका उपयोग करता हूं तो डीबी मॉडल के साथ काम करने के लिए नहीं, केवल व्यूमोडेल अपडेट के लिए।)

+0

धन्यवाद, यही वह जानकारी है जो मुझे चाहिए :) – Mirek

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