5

रिकॉर्ड पढ़ने की कोशिश करते समय मैं ईएफ के साथ संघर्ष कर रहा हूं, फिर उसी रिकॉर्ड में उन रिकॉर्ड्स को हटा दें। मैं शुरू में EntityState.Deleted विधि, जो त्रुटि देना होगा उपयोग कर रहा था:EntityState.Deleleted काम नहीं करता है, निकालें (इकाई) करता है?

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

लेकिन अगर मैं मैं नीचे है पसंद करने के लिए इसे बदलने, .remove() का उपयोग कर, तो सब कुछ ठीक है।

  1. उपयोग करने के लिए क्या अंतर और सर्वोत्तम समय है। Remove() बनाम हटाया गया?
  2. मैं इस काम को। हटाए गए विधि का उपयोग करके कैसे कर सकता हूं? मैंने पढ़ने के लिए मेरे भंडार में संदर्भ का एक नया उदाहरण बनाने और दूसरे को हटाने के लिए प्रयास किया है, लेकिन फिर आईईएनटीटीट्रैकर से संबंधित त्रुटियां कई उदाहरणों को ट्रैक नहीं कर सकतीं ... मैंने भी कोशिश की। निर्भर रिकॉर्ड लोड करने के लिए प्रारंभिक पढ़ने को शामिल करें ईएफ में तो यह जानता है और उन्हें हटा देता है। मैंने भी कोशिश की। पहले पढ़ने के रिकॉर्ड डालने। सभी का कोई फायदा नहीं हुआ।

प्रश्न में विधि यहां दी गई है। ध्यान दें कि मैं एक सामान्य भंडार जो .Deleted विधि है जो मुझे इस परिदृश्य जब तक अच्छी तरह से सेवा की है का उपयोग करता है (तब पढ़ने ही रिकॉर्ड को हटाने।)

//Delete Allocation Need and AllocatedContainers for alloc need id 
public ActionConfirmation<int> DeleteAllocRecords(int intFacilityId, AllocNeedSourceTypes needSourceType, int intNeedSourceId) 
{ 
var context = new InventoryMgmtContext(); 
var repository = new AllocationNeedRepository(context); 

//Delete Allocation Need and hence children in Allocated Containers 
var srcType = needSourceType.ToString(); 
List<AllocationNeed> allocNeeds = repository.SearchFor(
    x => x.FacilityId == intFacilityId 
    && x.NeedSourceType == srcType 
    && x.NeedSourceId == intNeedSourceId 
).ToList(); 

//var deleteRepository = new Repository<AllocationNeed>(); <--tried separate instance of context to delete...no worky. 

foreach (AllocationNeed allocNeed in allocNeeds) 
{ 
    try 
    { 
     //NO WORK: context.Entry(allocNeed).State = System.Data.EntityState.Deleted; 
     context.AllocationNeeds.Attach(allocNeed); 
     context.AllocationNeeds.Remove(allocNeed); <-- Works 
     context.SaveChanges(); 
    } 
    catch (Exception ex) 
    { 
     return ActionConfirmation<int>.CreateFailureConfirmation(ex.Message, allocNeed.Id); 
    } 
} 

उत्तर

6

Remove भी बच्चे वस्तुओं को हटाने जाएगा, लेकिन Deleted का उपयोग कर लूंगा नहीं। इस कारण से आपको वास्तव में Remove का उपयोग करना चाहिए। यदि आप वास्तव मेंDeleted का उपयोग करना चाहते हैं, तो आपको अपनी विदेशी कुंजी को निरर्थक बनाना होगा, लेकिन फिर आप अनाथ रिकॉर्ड के साथ समाप्त हो जाएंगे (जो मुख्य कारणों में से एक है जिसे आपको पहले स्थान पर नहीं करना चाहिए)।

+0

उपयोग करने का कोई वास्तविक कारण नहीं है। मुझे पता है कि मैंने उस विधि का उपयोग करने के लिए पहले से ही अपने जेनेरिक भंडार को लिखा है, लेकिन यह कोड का एक पंक्ति है। हटाने विधि, इसलिए मैं इसका उपयोग करूंगा । धन्यवाद! –

+0

निकालें बच्चे की वस्तुओं को नहीं हटाएगा। यदि बच्चे की वस्तु का एफके निरर्थक है तो यह इसे शून्य पर सेट कर देगा, यदि आवश्यक हो तो यह अपवाद फेंक देगा। बाल वस्तुओं को हटाने का तरीका कोड-फर्स्ट या डीबी-फर्स्ट में रिश्ते को 'कैस्केडऑनडेले' के रूप में चिह्नित करना है। – Shoe

+0

^-> या नीचे-अप हटाएं। – JoeBrockhaus

2

1.) उपयोग करने के लिए क्या अंतर और सर्वोत्तम समय है। Remove() बनाम हटाया गया?

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

Remove() उन पंक्तियों को ध्यान में रखेगा जो संबंधों का हिस्सा हैं।

2.) मैं इस काम को। हटाए गए विधि का उपयोग करके कैसे कर सकता हूं?

यदि आपके पास संबंधित पंक्तियों के लिए निर्दिष्ट ON CASCADE DELETE व्यवहार है, तो डेटाबेस को स्वचालित रूप से इसे संभालना चाहिए। जब आप ईएफ डेटाबेस उत्पन्न करते हैं तो यह डिफ़ॉल्ट व्यवहार होता है।

+0

यह एक डीबी पहला परिदृश्य है, और मेरे पास डेटाबेस में सेट डिस्प्ले पर कैस्केड है और मैंने जांच की है कि ईएफ ने इसे .edmx फ़ाइल में उठाया है ... तो ऐसा लगता है। हटाया गया केवल निर्दिष्ट इकाई को हटा देगा और कोई भी नहीं सम्बंधित। –

+0

जब आप कहते हैं कि यह केवल निर्दिष्ट इकाई को हटा देगा, तो क्या आपका मतलब ईएफ के इन-मेमोरी संग्रह, या डेटाबेस से है? क्या ईएफ एक अपवाद फेंक रहा है जब आप 'SaveChanges() '?यदि कोई अपवाद नहीं है, तो ईएफ मूल इकाई के लिए डिलीट भेज देगा, और यदि कैस्केड सेट किया गया है तो डेटाबेस पूरी तरह से किसी भी बच्चे को हटा देगा। हालांकि, मुझे आश्चर्य नहीं होगा अगर बाल संस्थाओं में इन-मेमोरी संग्रह सिंक से बाहर है। – JoeBrockhaus

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