有没有办法配置它并让它在EF中工作?我想尽可能使用这种情况,但是没有找到任何方法来做到这一点而不会出现错误“DELETE语句与REFERENCE约束冲突”
我已经看到了使用继承来处理这个问题的建议。比如在这篇文章中......但是,使用流畅的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());
}
}
}
答案 0 :(得分:1)
我不确定你所寻求的是否可行。你希望EF To Deferenciate在两个相同类型的集合之间,两个都是可选的,一个是删除级联而另一个是否。 EntityFramework map Fluid to One Table只有一个表,这个表有一些外键列来表示与Tool的关系。根据你的例子,你最终会在同一列中有两个外键到同一类型(Tool_Id和Tool_Id1:其中一个一次是空的。)Fluent Api是一个验证Api,不多也不少。所以它无法帮助你完成你想要的东西。我认为你最好的朋友是你提供的链接中的枚举和继承(我不明白为什么你不想使用它们。)
我现在可以思考的一种方式,我没有测试,即使它有效,我也不会推荐它。有一些列,可以采用两个值之一,L或H,并在您的代码中解决它,以区分重型和轻型工具。
我现在所说的只是一种意见,可能有一些我不知道的解决方案。我们拭目以待。