2014-11-14 101 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