2012-12-05 5 views
7

क्या एंटिटी फ्रेमवर्क 5 कोड में स्वचालित रूप से जेनरेट की गई कई-से-अधिक लिंक तालिका पर कैस्केड डिलीट विकल्प को चुनना संभव है? यहाँ एक सरल उदाहरण है जो यह की जरूरत है:चुनिंदा रूप से अक्षम करना कैस्केड को कई से अधिक लिंक टेबल पर हटाएं

public class Parent 
{ 
    public int Id { get; set; } 

    public virtual IList<ChildA> As { get; set; } 
    public virtual IList<ChildB> Bs { get; set; } 
} 

public class ChildA 
{ 
    public int Id { get; set; } 
    [Required] 
    public virtual Parent Parent { get; set; } 

    public virtual IList<ChildB> ChildBJoins { get; set; } 
} 

public class ChildB 
{ 
    public int Id { get; set; } 
    [Required] 
    public virtual Parent Parent { get; set; } 

    public virtual IList<ChildA> ChildAJoins { get; set; } 
} 

public class TestContext : DbContext 
{ 
    public DbSet<Parent> Parents { get; set; } 
    public DbSet<ChildA> As { get; set; } 
    public DbSet<ChildB> Bs { get; set; } 
} 

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

मुझे पता है कि मैं पर कास्केड हटाता निष्क्रिय कर सकते हैं कर रहा हूँ सब कई करने वाली कई प्रति this question रूप ManyToManyCascadeDeleteConvention को हटाने के द्वारा मिलती है, लेकिन यह है कि मैं क्या कर रहा हूँ के बाद नहीं है - मैं सिर्फ एक के लिए यह करने के लिए सक्षम होना चाहते हैं संबंध, या आदर्श रूप से एक संबंध के एक तरफ।

+0

आपको शायद 'माता-पिता-चाइल्डए' पर कैस्केडिंग डिलीट अक्षम करना होगा 'या 'अभिभावक-बाल बी' एक-टू- समस्या को हल करने के लिए कई रिश्ते। – Slauma

+0

मैं ऐसा नहीं करना चाहता - मैं उस रिश्ते को वहां छोड़ना चाहता हूं और इसे कई से हटा सकता हूं। यदि मैं मैन्युअल लिंक इकाई बनाता हूं, तो मैं इसे कर सकता हूं, लेकिन स्वचालित के साथ कोई रास्ता नहीं ढूंढ सकता। – Richard

उत्तर

0

मुझे संदेह है कि एंटीटी टाइप कॉन्फ़िगरेशन मैपिंग क्लास में ऐसा करने का कोई तरीका नहीं है, लेकिन मैंने इसे डीबी माइग्रेशन क्लास में ऊपर() विधि में कोड बदलकर किया।

लिंक तालिका के लिए उत्पन्न कोड है:

CreateTable(
    "dbo.ChildBChildAs", 
    c => new 
     { 
      ChildB_Id = c.Int(nullable: false), 
      ChildA_Id = c.Int(nullable: false), 
     }) 
    .PrimaryKey(t => new { t.ChildB_Id, t.ChildA_Id }) 
    .ForeignKey("dbo.ChildBs", t => t.ChildB_Id, cascadeDelete: true) 
    .ForeignKey("dbo.ChildAs", t => t.ChildA_Id, cascadeDelete: true) 
    .Index(t => t.ChildB_Id) 
    .Index(t => t.ChildA_Id); 

आप इसे पक्ष बदलकर काम कर पाने के लिए सक्षम होना चाहिए आप गलत पर झरना नहीं करना चाहती:

.ForeignKey("dbo.ChildAs", t => t.ChildA_Id, cascadeDelete: false) 

यह अच्छा होगा अगर आप फ्लुएंटैपी का उपयोग करके ऐसा कर सकते हैं क्योंकि आप एक से कई लोगों के साथ कर सकते हैं, लेकिन मैंने इसे करने का कोई तरीका नहीं ढूंढ पाया है

+0

यह सबसे अच्छा समाधान नहीं है क्योंकि माइग्रेशन को फिर से मचान करने की आवश्यकता हो सकती है, इस स्थिति में आप अपना संपादन खो देते हैं। ईएफ 6 में आप सम्मेलन को अक्षम कर सकते हैं, लेकिन यह 'मॉडलबिल्डर' के साथ कई सारे रिश्तों के लिए बंद हो जाता है। हटाएं <कई ToManyCascadeDeleteConvention>() 'लेकिन यह भी वांछित नहीं हो सकता है। – FRoZeN

+0

@FRoZeN सम्मेलन को पूरी तरह से अक्षम करने से निश्चित रूप से इसे चुनिंदा रूप से अक्षम नहीं किया जाएगा। शायद सबसे अच्छा समाधान मैन्युअल लिंक इकाई बनाना है क्योंकि रिचर्ड ने अपनी टिप्पणी में पोस्ट किया है, लेकिन यदि आप एक बेहतर तरीका जानते हैं, तो यह बहुत अच्छा होगा अगर आपने इसे पोस्ट किया – Colin

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