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