实体框架6 TPT,父实体上相同类型的多个集合

时间:2014-11-14 21:59:59

标签: entity-framework

有没有办法配置它并让它在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());
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我不确定你所寻求的是否可行。你希望EF To Deferenciate在两个相同类型的集合之间,两个都是可选的,一个是删除级联而另一个是否。 EntityFramework map Fluid to One Table只有一个表,这个表有一些外键列来表示与Tool的关系。根据你的例子,你最终会在同一列中有两个外键到同一类型(Tool_Id和Tool_Id1:其中一个一次是空的。)Fluent Api是一个验证Api,不多也不少。所以它无法帮助你完成你想要的东西。我认为你最好的朋友是你提供的链接中的枚举和继承(我不明白为什么你不想使用它们。)

我现在可以思考的一种方式,我没有测试,即使它有效,我也不会推荐它。有一些列,可以采用两个值之一,L或H,并在您的代码中解决它,以区分重型和轻型工具。

我现在所说的只是一种意见,可能有一些我不知道的解决方案。我们拭目以待。