25

मैं कोड-प्रथम का उपयोग कर तालिका पर कैस्केड डिलीट को सक्षम करना चाहता हूं। जब मॉडल को स्क्रैच से फिर से बनाया जाता है, तो रिश्तों को स्वचालित रूप से सेट अप होने के बावजूद कोई कैस्केड डिलीट सेट नहीं होता है। अजीब चीज यह है कि यह कई तालिकाओं के लिए कुछ तालिकाओं के लिए सक्षम बनाता है, हालांकि आपको लगता है कि इसमें समस्याएं हो सकती हैं।आप कैसे सुनिश्चित करते हैं कि ईएफ कोड में तालिका संबंधों पर कैस्केड हटाएं सक्षम है?

सेटअप: तालिका A < - टेबल बी

टेबल बी की FK तालिका A के पी को इंगित करता है।

यह क्यों काम नहीं करेगा?

+1

में इस बारे में अधिक देखते हैं? ऐसे मामले में कैस्केड हटाना 'OneToManyCascadeDeleteConvention' द्वारा उत्पन्न किया जाना चाहिए। –

+1

@ लाडिस्लाव: क्या सामान्य 'इकाई-ढांचे' टैग को हटाने के लिए यह अच्छा है? मैं बस सोच रहा था कि मेरे पसंदीदा टैग के तहत प्रश्नों से अचानक यह प्रश्न गायब क्यों हुआ। मैंने अब 'इकाई-फ्रेमवर्क-4.1' और' इकाई-फ्रेमवर्क -4' और ... और ... और ... जोड़ा है लेकिन यह उन सभी टैग को जांचने के लिए अब थोड़ा सा हो रहा है। मुझे यकीन नहीं है कि प्रश्न पर टैग को धीरे-धीरे विशेषज्ञता देने का पदानुक्रम बेहतर नहीं होगा। मुझे एक जोखिम दिखाई देता है कि कम पाठक केवल बहुत ही विशेष टैग वाले प्रश्न देखेंगे जो प्रश्नकर्ता के हित में नहीं हैं। – Slauma

+1

@ स्लुमा: मैं सहमत हूं, लेकिन या तो हम ईएफ 4 और ईएफ 4.1 टैग दोनों को बंद करने पर जोर देंगे और हम केवल ईएफ टैग (जो कि मैं सही तरीका है) का उपयोग करूंगा या हम उनकी सामग्री के आधार पर प्रश्न टैग करेंगे। मैं इस विषय के बारे में मेटा पर जल्द ही प्रश्न खोलूंगा, क्योंकि ईएफ टैग के साथ और समस्याएं हैं। –

उत्तर

53

संभावित कारण यह है कि आपको कैस्केडिंग डिलीट क्यों नहीं मिलता है यह है कि आपका रिश्ते वैकल्पिक है। उदाहरण:

public class Category 
{ 
    public int CategoryId { get; set; } 
} 

public class Product 
{ 
    public int ProductId { get; set; } 
    public Category Category { get; set; } 
} 

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

एनोटेशन:

public class Product 
{ 
    public int ProductId { get; set; } 
    [Required] 
    public Category Category { get; set; } 
} 

Fluent एपीआई:

आप रिश्ते फिर आवश्यक है करने के लिए चाहते हैं तो आप दो विकल्प हैं

modelBuilder.Entity<Product>() 
      .HasRequired(p => p.Category) 
      .WithMany(); 

हटाना व्यापक दोनों ही मामलों में स्वचालित रूप से विन्यस्त किया जाएगा ।

आप संबंध है वैकल्पिक लेकिन व्यापक साथ हटाना चाहते हैं तो आप इस पर स्पष्ट रूप विन्यस्त करने की जरूरत:

modelBuilder.Entity<Product>() 
      .HasOptional(p => p.Category) 
      .WithMany() 
      .WillCascadeOnDelete(true); 

संपादित करें: पिछले कोड में स्निपेट को भी बस .WillCascadeOnDelete() लिख सकते हैं। कैस्केडिंग डिलीट सेट अप करने के लिए यह पैरामीटर रहित अधिभार true पर डिफ़ॉल्ट है।

FK की आवश्यकता है (गैर-व्यर्थ) documentation

+0

क्या इसका मतलब यह है कि यदि आप सम्मेलन निर्दिष्ट नहीं करते हैं, WillCascadeOnDelete() डिफ़ॉल्ट रूप से बंद है? – jaffa

+3

@ जोन: नहीं, कैस्केडऑनडेलेट आम तौर पर बंद नहीं होता है। सम्मेलन कहता है: यह है कि यदि आपका रिश्ते/नेविगेशन संपत्ति "आवश्यक" है (= विदेशी कुंजी/संदर्भ शून्य होने के लिए मना किया जाता है)। लेकिन अगर आपका रिश्ते/नेविगेशन "वैकल्पिक" है (= विदेशी कुंजी/संदर्भ शून्य होने की अनुमति है) तो यह बंद है। आप दोनों मामलों में सम्मेलन को ओवरराइट कर सकते हैं: आप एक आवश्यक नेविगेशन प्रॉपर्टी के लिए कैस्केडिंग डिलीट को बंद कर सकते हैं और आप इसे वैकल्पिक नेविगेशन प्रॉपर्टी के लिए स्विच कर सकते हैं। आप "OneToManyCascadeDeleteConvention" को भी बंद कर सकते हैं। फिर आप हमेशा यह निर्दिष्ट करना चाहते हैं कि आप फ़्लुएंट एपीआई में क्या चाहते हैं। – Slauma

+0

@ स्लुमा मैंने पढ़ा है कि यदि विदेशी कुंजी शून्य नहीं है तो आपके रिश्तों को जरूरी माना जाता है जो आपके पहले उदाहरण के मामले में है। यहां "रिलेशनशिप कन्वेंशन" पढ़ें: http://msdn.microsoft.com/en-us/data/jj679962.aspx – ajbeaven

0
modelBuilder 
.Entity<Product>() 
.HasRequired(p => p.Category) 
.WithMany(x => x.Products) 
.WillCascadeOnDelete(true); 
संबंधित मुद्दे