मैं इस दिन एक दिन की तरह निराश हूं ... कृपया मदद करें।एएसपी.नेट एमवीसी 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);
}
के अनुसार संदर्भ में मौजूदा लेकिन संशोधित इकाई को संदर्भित करना
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: सुधार
जब आप कहते हैं कि "आइटम नहीं जोड़ सकते हैं", तो इसका क्या अर्थ है? क्या इसका मतलब है कि एक अपवाद उत्पन्न होता है? यदि हां, तो अपवाद क्या है? –
हाँ क्या आप अपवाद पोस्ट कर सकते हैं? – Jack