0

エンティティ フレームワークを使用して既存のデータベースをコード ベースにマップする際に問題が発生しています。同様のことを行ったコードも見つからないようです。マルチレイヤーの継承が必要で、2 つの異なるマッピング タイプを使用するレイヤーが必要です。しかし、私はいくつかの奇妙な行動をしています。動作を再現するために、単純なモデルを作成し、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);
    }


}

ルートから子 (A または B) へのマッピングに TPT を使用し、ChildA から SubChild への TPH を使用しようとしています。主な問題は、EF がルート オブジェクトに識別子を配置していることです。また、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 に答える