0

我在使用实体框架将现有数据库映射到代码库时遇到问题。我似乎也找不到任何类似的代码。我需要有多层继承,我需要这些层使用两种不同的映射类型。我有一些奇怪的行为。为了重现该行为,我创建了一个简单的模型并允许 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; }
}

这会产生以下架构:

架构

我的上下文如下:

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 到 Child(A 或 B)的映射,并将 TPH 用于 ChildA 到 SubChild。主要问题是 EF 将鉴别器放在 Root 对象上。它还将 ChildA 属性放在那里,我认为这是不正确的,但现在问题不大。由于鉴别器位于根上,它会导致错误,因为 ChildB 未映射到该鉴别器中的类型。

有人可以建议一种我可以让 ChildA 表实际维护其自己的属性和鉴别器而不将它们推到根表的方法。

4

1 回答 1

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; }
}

在您的上下文中,您希望 ChildA 和 ChildB 的 TPT

所以

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

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

子项的 TPH

  public DbSet<SubChild> Childs { get; set; }
于 2013-08-05T06:10:32.583 回答