具有多层继承的EF 5混合继承类型

时间:2013-08-04 23:23:55

标签: c# entity-framework hierarchy

我遇到使用实体框架将现有数据库映射到代码库的问题。我似乎无法找到任何类似的代码。我需要有多层继承,我需要使用两种不同的映射类型。我虽然有一些奇怪的行为。为了重现这种行为,我创建了一个简单的模型,并允许EF以它希望的方式映射它。

我的实体如下:

public abstract class Root
{
    public int RootId { get; set; }

    public string RootProperty { get; set; }
}

public abstract class ChildA : Root
{
    public string ChildAProperty { get; set; }
}

public class ChildB : Root
{
    public string ChildBProperty { get; set; }
}

public class SubChildAa : ChildA
{
    public string SubChildAaProperty { get; set; }
}

public class SubChildAb : ChildA
{
    public string SubChildAbProperty { get; set; }
}

这导致以下架构:

Schema

我的背景如下:

class MyContext : DbContext
{
    public DbSet<SubChildAa> ChildAas { get; set; }
    public DbSet<SubChildAb> ChildAbs { get; set; }
    public DbSet<ChildB> ChildBs { get; set; }

    public MyContext()
    {
        //Database.SetInitializer<MyContext>(null);
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<Root>().ToTable("Root");

        modelBuilder.Entity<ChildB>().ToTable("ChildB");

        modelBuilder.Entity<ChildA>().ToTable("ChildA");
        modelBuilder.Entity<ChildA>().Map<SubChildAa>(u => u.Requires("ChildAType").HasValue("SubChildAa"));
        modelBuilder.Entity<ChildA>().Map<SubChildAb>(u => u.Requires("ChildAType").HasValue("SubChildAb"));
        //base.OnModelCreating(modelBuilder);
    }


}

我正在尝试使用TPT进行Root to Child(A或B)映射,将TPH用于ChildA到SubChild。主要问题是EF将鉴别器放在Root对象上。它也将ChildA属性放在那里,我认为这是不正确的,但现在不是问题。如果鉴别器位于Root上,则会导致错误,因为ChildB不会映射到该鉴别器中的类型。

有人可以提出一种方法,让我可以让ChildA表实际保持自己的属性和鉴别器而不将它们推送到根表。

1 个答案:

答案 0 :(得分:0)

像这样的东西

public abstract class Root
{
  [Key]
  public int RootId { get; set; }
  public string RootProperty { get; set; }
}

public class ChildA : Root
{
 [Required]
 int RootId 
 ForeignKey["RootId"]
 public Root Root {get;set;}    
 public string ChildAProperty { get; set; }
} 

public class ChildB : Root {
   [Required]
   int RootId   
   ForeignKey["RootId"]
   public Root Root {get;set;}      
   public string ChildBProperty { get; set; }
 }

public class SubChildAa : ChildA
{
  public string SubChildAaProperty { get; set; }
}

public class SubChildAb : ChildA
{
  public string SubChildAbProperty { get; set; }
}

在您的上下文中,您需要TPT for ChildA和ChildB

所以

  public DbSet<ChildA> ChildAas { get; set; }

  public DbSet<ChildB> ChildBs { get; set; }

子孙的TPH

  public DbSet<SubChild> Childs { get; set; }
相关问题