EF Code First CTP 4 を使用して、単純なプロジェクトを作成しました。このプロジェクトは 2 つのクラスで構成され、一方は他方から継承されます。
データを別々のテーブルに保存したいのですが、EF 4 のデフォルトでは、これら 2 つのエンティティを同じテーブルにマップ/保存します。
を使用.ToTable()
すると、この動作を変更できますが、これには副作用があります。継承されたオブジェクトを永続化すると、EF は基本クラスの共通の値 (ID など) を永続化しません。
マッピングにいくつかの情報を設定するために出発していると確信していますが、どれがわかりません。
static void Main(string[] args)
{
Database.SetInitializer<ZooContext>(new RecreateDatabaseIfModelChanges<ZooContext>());
using (ZooContext ctx = new ZooContext())
{
Mammal mam = new Mammal() ;
mam.NumberOfLegs = 4;
ctx.Animals.Add(mam);
// ctx.Mammals.Add(mam) as the same behavior
ctx.SaveChanges();
}
}
public class ZooContext : DbContext
{
public DbSet<Animal> Animals { get; set; }
public DbSet<Mammal> Mammals { get; set; }
protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
{
modelBuilder.Entity<Animal>().HasKey(p => p.Id).
MapHierarchy().
Case<Animal>(a => new { a.Id });
modelBuilder.Entity<Animal>().HasKey(p => p.Id).
MapHierarchy().
Case<Mammal>(a => new { a.Id, a.NumberOfLegs }).ToTable("Mammals");
base.OnModelCreating(modelBuilder);
}
}
public class Animal
{
public virtual int Id { get; set; }
}
public class Mammal : Animal
{
public int NumberOfLegs { get; set; }
}