2009-11-20 14 views
8

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

मैं डेटाबेस से डेटा पढ़ने और लिखने में कामयाब रहा, लेकिन अद्यतन करते समय मुझे एक छोटी सी समस्या है:
मेरे पास एक टेबल "स्टॉक" है जो एक तालिका "वेयरहाउस" से जुड़ा हुआ है।

मौजूदा प्रक्रिया इस एक है (सरलीकृत, लेकिन भावना बनी हुई है, अधिक क्षेत्रों देखते हैं):

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

समस्या यहाँ जब मैं नया स्टॉक वस्तु बनाने और इसे वेयरहाउस में सहयोगी, वस्तु EntityState स्वचालित रूप से "जोड़ा गया" पर सेट है कि है। इसलिए जब मैं SaveChanges() और स्टॉक पहले से मौजूद करता हूं, तो लाइन अपडेट हो जाती है और एक नई स्टॉक लाइन जोड़ दी जाती है ...
मैं जो चाहता हूं वह नई स्टॉक ऑब्जेक्ट को तब तक अलग रखना है जब तक कि मैं इसे स्वयं संलग्न नहीं करता। मैं नहीं चाहता कि यह स्वचालित रूप से होता है।

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

कोई बात यह है कि मैं स्टॉक ऑब्जेक्ट को कैसे अलग रख सकता हूं?


संहिता (यह एक छोटे गलत हो सकता है, मैं स्मृति से यह लिखा था):

Stock stk = new Stock(); 
stk.Date = DateTime.Now; 
stk.Volume = 100;   //so far stk is "Detached" and that's cool. 
stk.Warehouse = CurrentWarehouse; //stk become "Added" and that's less cool. 

DAL.Stock.Instance.Save(stk); 

सहेजें() में:

var existing = (from s in Context.CurrentContext.Stock 
where s.Warehouse.WarehouseId == stk.Warehouse.WarehouseId && s.Date == stk.Date && s.Type == 2 
select s).FirstOfDefault(); 

if(existing != null) 
{ 
    existing.Volume = stk.Volume; 
    Context.CurrentContext.Detach(stk); //I find it a stupid workaround !!!!!! 
} 
else 
{ 
    Context.CurrentContext.AddToStock(stk); //what I would want to do. 
} 

Context.CurrentContext.SaveChanges() 
+0

मेरे लिए वही! क्या आपने यह अंदाजा लगाया? –

+0

दुख की बात नहीं।और मुझे उपयोग किए गए कामकाज को याद नहीं है। मुझे लगता है कि मैंने पीओसीओ वस्तुओं का उपयोग करना शुरू कर दिया। –

उत्तर

1

आप शायद सिर्फ MergeOption सेट करना चाहते हैं एक उपयुक्त मूल्य के लिए। NoTracking सबकुछ एक अलग राज्य में रखेगा, और आपको अपना मैन्युअल काम करने की अनुमति देगा। ऐसा करने के अन्य तरीके हैं, लेकिन मैं अलग होने के लिए मर्जऑशन सेट करके कुछ ऐसा कर रहा हूं।

http://msdn.microsoft.com/en-us/library/system.data.services.client.dataservicecontext.mergeoption.aspx

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