次のような TPC 階層があります。
public abstract class Base
{
public Guid BaseId { get; set; }
public string BaseName { get; set; }
}
public class Sub1 : Base
{
public Sub2 Vender { get; set; }
}
public class Sub2 : Base
{
public Sub1 Customer { get; set; }
}
public class MyDbContext : DbContext
{
public MyDbContext()
: base("name=db")
{ }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Sub1>().HasRequired(x => x.Vender).WithOptional(x => x.Customer);
modelBuilder.Entity<Sub1>().Map(x =>
{
x.ToTable("Sub1s");
x.MapInheritedProperties();
}).HasKey(x => x.BaseId);
modelBuilder.Entity<Sub2>().Map(x =>
{
x.ToTable("Sub2s");
x.MapInheritedProperties();
}).HasKey(x => x.BaseId);
}
public DbSet<Base> People { get; set; }
public DbSet<Sub2> Venders { get; set; }
public DbSet<Sub1> Customers { get; set; }
}
次に、コードを実行し、EF がテーブル (Sub1 と Sub2) を作成します。ただし、EF はテーブル Sub1 の追加の外部キーを作成します。外部キーとして Sub1 のキーを使用しません。Vender_BaseId という名前の追加の FK を生成します。