2008-11-20 18 views
5

का उपयोग कर काम नहीं कर रहा है मैं एक आवेदन के लिए एएसपीएनटी एमवीसी का उपयोग कर रहा हूं। मैंने एमवीसी स्टोरफ्रंट पर रॉब कॉनरी की श्रृंखला से कुछ मार्गदर्शन लिया है। मैं स्टोरफ्रंट में उपयोग किए जाने वाले एक बहुत ही समान डेटा एक्सेस पैटर्न का उपयोग कर रहा हूं।लिंक से एसक्यूएल अपडेट रिपोजिटरी पैटर्न

हालांकि, मैंने पैटर्न में थोड़ा अंतर जोड़ा है। मेरे मॉडल में बनाए गए प्रत्येक वर्ग में IsNew नामक एक संपत्ति है। इस पर इरादा मुझे यह निर्दिष्ट करने की अनुमति देना है कि मुझे डेटाबेस में डालने या अपडेट करना चाहिए या नहीं।

मेरी नियंत्रक में:

OrderService orderService = new OrderService(); 
Order dbOrder = orderService.GetOrder(ID); 

if (ModelState.IsValid) 
{ 
    dbOrder.SomeField1 = "Whatever1"; 
    dbOrder.SomeField2 = "Whatever2"; 
    dbOrder.DateModified = DateTime.Now; 
    dbOrder.IsNew = false; 

    orderService.SaveOrder(dbOrder); 
} 

और फिर SQLOrderRepository में:

यहाँ कुछ कोड है

public void SaveOrder(Order order) 
{ 
    ORDER dbOrder = new ORDER(); 

    dbOrder.O_ID = order.ID; 
    dbOrder.O_SomeField1 = order.SomeField1; 
    dbOrder.O_SomeField2 = order.SomeField2; 
    dbOrder.O_DateCreated = order.DateCreated; 
    dbOrder.O_DateModified = order.DateModified; 

    if (order.IsNew) 
     db.ORDERs.InsertOnSubmit(dbOrder); 

    db.SubmitChanges(); 
} 

मैं नियंत्रक कोड को बदलते हैं ताकि dbOrder.IsNew = true ; तब कोड काम करता है, और मान सही ढंग से डाले जाते हैं।

हालांकि, अगर मैं dbOrder.IsNew = false सेट करता हूं; तो कुछ भी नहीं होता ... कोई त्रुटि नहीं है - यह आदेश को अपडेट नहीं करता है।

मैं यहाँ DebuggerWriter उपयोग कर रहा हूँ: http://www.u2u.info/Blogs/Kris/Lists/Posts/Post.aspx?ID=11 एसक्यूएल जाता है कि उनके जेनरेट होने का पता लगाने के लिए, और उम्मीद के रूप में, जब IsNew मूल्य सच है, सम्मिलित एसक्यूएल उत्पन्न होते हैं और ठीक से क्रियान्वित किया जाता है। हालांकि, जब IsNew को गलत पर सेट किया गया है, तो कोई SQL उत्पन्न नहीं होता है, इसलिए कुछ भी निष्पादित नहीं होता है।

मैंने सत्यापित किया है कि यहां समस्या (LINQ not updating on .SubmitChanges()) समस्या नहीं है।

किसी भी मदद की सराहना की है।

उत्तर

7

अपनी SaveOrder विधि में आप हमेशा एक नया ORDER ऑब्जेक्ट बना रहे हैं। आपको इसे बदलने की जरूरत है ताकि अगर आदेश हो। यह नया झूठा है, यह मौजूदा डी को डीबी से पुनर्प्राप्त करता है और इसके बजाय इसे अपडेट करता है।

public void SaveOrder(Order order) 
{ 
    ORDER dbOrder; 
    if (order.IsNew) 
    { 
     dbOrder = new ORDER(); 
     dbOrder.O_ID = order.ID; 
    } 
    else 
    { 
     dbOrder = (from o in db.ORDERS where o.O_ID == order.ID select o).Single(); 
    } 

    dbOrder.O_SomeField1 = order.SomeField1; 
    dbOrder.O_SomeField2 = order.SomeField2; 
    dbOrder.O_DateCreated = order.DateCreated; 
    dbOrder.O_DateModified = order.DateModified; 

    if (order.IsNew) 
     db.ORDERs.InsertOnSubmit(dbOrder); 

    db.SubmitChanges(); 
} 
1

मुझे लगता है कि आपको समस्या है कि आपकी इकाई को आपके संदर्भ से अलग किया गया है।

यदि आप अपडेट करना चाहते हैं तो आपको अपनी इकाई को अपने संदर्भ में वापस संलग्न करने का प्रयास करना चाहिए। LINQtoSQL का नकारात्मक पक्ष यह है कि पुनः अनुलग्नक के लिए आपको ऑब्जेक्ट की मूल स्थिति की आवश्यकता होगी जब इसे अलग किया गया था ...

एक और समाधान संदर्भ से अपनी इकाई को फिर से प्राप्त करना है और सभी डेटा कॉपी करना है पैरामीटर में आपकी इकाई। यह तब तक करेगा जब तक आपके पास अधिक जटिल इकाइयां न हों।

1

क्या tvanfosson ने कहा।

मैं सिर्फ यह जोड़ना चाहता हूं कि मैं तर्क का उपयोग करता हूं, जहां आईडी डिफ़ॉल्ट (0 या गिट्स का उपयोग करते हुए खाली) के बराबर होती है, तो मुझे लगता है कि यह नया है। अन्यथा यदि मेरे पास आईडी पास हो गई है, तो मैं मौजूदा ऑब्जेक्ट प्राप्त करता हूं और इसे अपडेट करता हूं।

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