2014-11-14 87 views
0

有什麼方法可以配置它並讓它在EF中工作?如果可能的話,我想使用這種情況,但還沒有找到任何方式來做到這一點,但沒有得到一個錯誤「DELETE語句與REFERENCE約束衝突」實體框架6 TPT,父實體上的同一類型的多個集合

我看到了使用繼承來處理這個問題的建議。比如在這篇文章中......但是,這真的不可能使用流利的API進行配置嗎? Multiple collections of same type in entity framework

這裏是我的測試用例....

public class ToolSet 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Tool> Tools { get; set; } 
} 

public class Tool 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Fluid> HeavyFluid { get; set; } 
    public virtual ICollection<Fluid> LightFluid { get; set; } 
} 

public class Fluid 
{ 
    public int Id { get; set; } 
    public double Density { get; set; } 
} 

public class ExampleContext : DbContext 
{ 
    public DbSet<ToolSet> ToolSets { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.Entity<ToolSet>().HasMany(x => x.Tools).WithRequired().WillCascadeOnDelete(true); 
     modelBuilder.Entity<Tool>().HasMany(x => x.HeavyFluid).WithOptional().WillCascadeOnDelete(true); 
     modelBuilder.Entity<Tool>().HasMany(x => x.LightFluid).WithOptional().WillCascadeOnDelete(false); 
    } 
} 

public class SeedDb : DropCreateDatabaseAlways<ExampleContext> 
{ 
    public override void InitializeDatabase(ExampleContext context) 
    { 
     base.InitializeDatabase(context); 
     var heavyFluids = new List<Fluid> { new Fluid { Density = 1 }, new Fluid { Density = 2 } }; 
     var lightFluids = new List<Fluid> { new Fluid { Density = .1 }, new Fluid { Density = .2 } }; 
     var toolSet = new ToolSet 
     { 
      Tools = new List<Tool> 
      { 
       new Tool{HeavyFluid =heavyFluids, LightFluid = lightFluids} 
      } 
     }; 
     context.ToolSets.Add(toolSet); 
     context.SaveChanges(); 
    } 
} 

[TestClass] 
public class UnitTest1 
{ 
    [TestInitialize] 
    public void TestInitialize() 
    { 
     Database.SetInitializer(new SeedDb()); 
    } 

    [TestMethod] 
    public void TestMethod1() 
    { 
     using (var a = new ExampleContext()) 
     { 
      var toRemove = a.ToolSets.First(); 
      a.ToolSets.Remove(toRemove); 
      a.SaveChanges(); 
      Assert.IsFalse(a.ToolSets.Any()); 
     } 
    } 
} 

回答

1

我不知道,如果你正在尋找可能。你需要兩個相同類型集合之間的EF To Deferenciate,這兩個集合都是可選的,一個在級聯上刪除,另一個沒有。 EntityFramework映射Fluid to One Table和只有一個表,這個表有一些外鍵列來表示與Tool.I的關係。根據你的例子,你最終會在同一列中有兩個外鍵到相同的類型(Tool_Id和Tool_Id1:其中一個將一次爲空)。Fluent Api是一個驗證Api,不多不少,所以它不能完成你想要的任務。我認爲你最好的朋友是枚舉和繼承,因爲你提供的鏈接(我不明白你爲什麼不想使用它們)。

我現在可以想到的一種方式,即使我沒有測試,我也不會推薦它,即使它工作。有一些列可以取兩個值L或H中的一個,並在代碼中解決它以在重型和輕型工具之間進行區分。

我現在所說的只是一個意見,可能有解決方案,我不知道about.let的觀望。

+0

我確實使用了上述解決方案,只是感到驚訝,沒有更好的指導圍繞這種情況。像ORM一樣神奇,很容易忘記它們在我們通常將物體連接在一起的方式上施加的幾個限制。具有相同類型的兩個子對象是典型的面向對象的場景,但顯然不能很好地映射到數據庫。順便說一句,級聯刪除一個項目,而不是另一個是爲了防止多級聯刪除路徑,似乎這是一個常見的EF問題:) – GetFuzzy 2014-11-18 00:56:57