7

मैं इस मॉडल हैइकाई की रूपरेखा संहिता के प्रथम 5 कास्केड कई तालिकाओं के लिए कई पर हटाएँ त्रुटि

public class State 
{ 
    public State() 
    { 
     this.Promotions = new List<Promotion>(); 
     this.Branches = new List<Branch>(); 
     this.Stores = new List<Store>(); 
    } 

    public int Id { get; set; } 
    public string Description { get; set; } 

    public virtual ICollection<Promotion> Promotions { get; set; } 
    public virtual ICollection<Store> Stores { get; set; } 
    public virtual ICollection<Branch> Branches { get; set; } 
} 

public class Store 
{ 
    public Store() 
    { 
     this.Promotions = new List<Promotion>(); 
     this.Branches = new List<Branch>(); 
    } 

    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Promotion> Promotions { get; set; } 
    public virtual ICollection<Branch> Branches { get; set; } 

    public int StateId { get; set; } // Foreign key 
    public virtual State State { get; set; } // Navigation Property 
} 

public class Branch 
{ 
    public Branch() 
    { 
     this.Promotions = new List<Promotion>(); 
    } 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public int StoreId { get; set; } // Foreign key 
    public int StateId { get; set; } // Foreign key 

    public virtual Store Store { get; set; } // Navigation Property 
    public virtual State State { get; set; } // Navigation Property 

    public virtual ICollection<Promotion> Promotions { get; set; } 
} 

    public class Promotion 
{ 
    public Promotion() 
    { 
     this.Stores = new List<Store>(); 
     this.Branches = new List<Branch>(); 
     this.Productos = new List<Producto>(); 
    } 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public int StateId { get; set; } 

    public virtual ICollection<Store> Stores { get; set; } 
    public virtual ICollection<Branch> Branches { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 

    public virtual State State { get; set; } 

} 

और ये मेरे संदर्भ में:

// State 
modelBuilder.Entity<State>() 
    .HasMany(p => p.Promotions) 
    .WithRequired(e => e.State) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<State>() 
    .HasMany(s => s.Branches) 
    .WithRequired(e => e.State) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<State>() 
    .HasMany(e => e.Stores) 
    .WithRequired(e => e.State) 
    .WillCascadeOnDelete(true); 

// Store 
modelBuilder.Entity<Store>() 
    .HasMany(b => b.Branches) 
    .WithRequired(s => s.Store) 
    .WillCascadeOnDelete(true); 

// Many to many 
modelBuilder.Entity<Store>(). 
    HasMany(p => p.Promotions). 
    WithMany(s => s.Stores). 
    Map(
    m => 
    { 
     m.MapLeftKey("StoreId"); 
     m.MapRightKey("PromotionId"); 
     m.ToTable("Store_Promotion"); 
    }); 

modelBuilder.Entity<Promotion>(). 
HasMany(e => e.Products). 
WithMany(p => p.Promotiones). 
Map(
    m => 
    { 
     m.MapLeftKey("PromotionId"); 
     m.MapRightKey("ProductoId"); 
     m.ToTable("Promotion_Producto"); 
    }); 

modelBuilder.Entity<Branch>(). 
HasMany(p => p.Promotiones). 
WithMany(b => b.Branches). 
Map(
    m => 
    { 
     m.MapLeftKey("BranchId"); 
     m.MapRightKey("PromotionId"); 
     m.ToTable("Branch_Promotion"); 
    }); 

अब अगर मैं एक से अधिक WillCascadeOnDelete पर बारी राज्य (पहले तीन धाराप्रवाह मानचित्रण में) की मैं त्रुटि

टेस्ट विधि Proj.Data.Tests.UnitTest1.TestPromotion अपवाद दिए मिलती है:
System.Data.SqlClient.SqlException: तालिका 'शाखा' पर विदेशी कुंजी बाधा 'FK_dbo.Branch_dbo.Store_StoreId' पेश करना चक्र या एकाधिक कैस्केड पथ का कारण बन सकता है। किसी भी कार्रवाई को हटाएं या अद्यतन पर कोई क्रिया निर्दिष्ट करें, या अन्य विदेशी कुंजी बाधाओं को संशोधित करें। बाधा उत्पन्न नहीं कर सका। पिछली त्रुटियां देखें।

मैं जानता हूँ कि, और मैं जूली Lerman की किताब से पढ़ा है:

कुछ डेटाबेस (SQL सर्वर सहित) कई रिश्तों कि झरना एक ही मेज

की ओर इशारा करते हटाना निर्दिष्ट का समर्थन नहीं करते

ऐसा इसलिए होता है क्योंकि कई रिश्तों की मेज से कई संबंधित तालिकाओं से कैस्केड हटाना पड़ता है।

तो, मेरा सवाल यह है कि: यहां एकमात्र विकल्प है कि मूल तालिकाओं पर कैस्केड डिलीट को बंद करना और रिलेशनशिप टेबल पर मैन्युअल रूप से हटाना है? इसके लिए एंटिटी फ्रेमवर्क 5 से कोई कामकाज नहीं है?

उत्तर

6

ठीक है, मुझे समस्या समझा। इसमें कई रिश्तों के लिए बहुत कुछ नहीं है, समस्या यह है कि

State -> Promotion -> PromotionStore 
State -> Branch -> BranchPromotion 
State -> Store -> StorePromotion 

और फिर स्टोर, शाखा और स्टोर में राज्य में एफके है। इसलिए यदि मैं एक राज्य संवर्धन स्टोर हटा देता हूं तो पहली और तीसरी संभावनाओं तक पहुंचा जा सकता है।

क्या मैं कर इस तरह मैन्युअल रूप से बंद करने के राज्य के लिए झरना हटा सकते हैं और हटाने से संबंधित रिकॉर्ड है समाप्त हो गया:

public override void Delete(State state) 
{ 
    DbContext.Entry(state).Collection(x => x.Promotions).Load(); 
    DbContext.Entry(state).Collection(x => x.Stores).Load(); 
    DbContext.Entry(state).Collection(x => x.Branches).Load(); 

    var associatedPromotions = state.Promotions.Where(p => p.StateId == state.Id); 
    associatedPromotions.ToList().ForEach(r => DbContext.Set<Promotion>().Remove(r)); 

    var associatedStores = state.Stores.Where(e => e.StateId == state.Id); 
    associatedStores.ToList().ForEach(e => DbContext.Set<Store>().Remove(e)); 

    var associatedBranches = state.Branches.Where(s => s.StateId == state.Id); 
    associatedBranches.ToList().ForEach(s => DbContext.Set<Branch>().Remove(s)); 

    base.Delete(state); 
} 

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

  • कोई संबंधित समस्या नहीं^_^