2012-01-30 23 views
5

मैं नॉर्थविंड नमूना डेटाबेस का उपयोग कर रहा हूं। व्यापक साथ हटाता, आदेश विवरण -इकाई फ्रेमवर्क कैस्केडिंग हटाना और आलसी लोडिंग

var db = new NorthwindEntities(); 
int id = 2; // Example 
var delObject = (from o in db.Orders.Include("Order_Details") 
       where o.OrderID == id 
       select o).First(); 
db.Orders.DeleteObject(delObject); 
db.SaveChanges(); 
  • मैं आदेश में एक (1-से-अनेक) संघ है: मैं इस कोड है। (यदि मैं एक आदेश हटा देता हूं, तो उसी ऑर्डर आईडी के साथ सभी ऑर्डर_Details हटा दिए जाएंगे)।

  • मेरे पास LazyLoading सक्षम है।

अगर मैं खंड से में .Include("Order_Details") हटाने के लिए, झरना हटाना काम नहीं करेगा।

ऐसा क्यों होता है? आलसी प्रारंभिकता मेरे लिए ऑर्डर_Details "शामिल" नहीं है, और अंत में मुझे हटाए जाने की अनुमति दें?

+0

नहीं। मेरे अनुभव में, कैस्केडिंग डिलीट केवल मेमोरी ऑब्जेक्ट्स पर लागू होती है। – cadrell0

उत्तर

5

कैस्केडिंग डिलीट आपके ईएफ मॉडल में परिभाषित किया गया है।

ईएफ इसलिए लोड किए गए डेटा के लिए डिलीट स्टेटमेंट जेनरेट करेगा। ईएफ डेटाबेस को नहीं जायेगा यह जांचने के लिए कि इसे क्या हटाया जाना चाहिए।

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

1

क्या आपके पास डेटाबेस और इकाई कॉन्फ़िगरेशन दोनों में परिभाषित कैस्केडिंग डिलीट है? मैंने देखा है कि इसे केवल एक में परिभाषित किया गया है और दूसरा यह समस्या नहीं पैदा कर सकता है।

+0

वास्तव में, यह काम करता है, लेकिन ऐसा क्यों होता है? – ColdFusion

1

ईएफ मॉडल में कैस्केड हटाना केवल उन विवरणों को हटा देता है जिन्हें संदर्भ में लोड किया गया है। यदि आप उपयोग करते हैं तो आदेश आदेश सहित विवरण के दौरान ऑर्डर_Details लोड किया जाता है। यदि आप LazyLoading को सक्षम करते हैं और शामिल नहीं करते हैं तो वे आवश्यक आधार पर लोड होते हैं, यानी जब आप नेविगेशन गुणों का संदर्भ देते हैं। इस प्रकार यदि आप विवरणों की परवाह नहीं करते हैं और सहमति देते हैं कि उन्हें मास्टर रिकॉर्ड के साथ चुपचाप हटा दिया जाएगा तो आपको ईएफ मॉडल और डीबी स्कीमा दोनों में कैस्केड हटाने को परिभाषित करना होगा।

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