【问题标题】:Entity Framework 4 - Code First not storing inherited table separate from base tableEntity Framework 4 - Code First 不将继承的表与基表分开存储
【发布时间】:2010-07-28 19:58:20
【问题描述】:

使用 EF Code First CTP 4,我创建了一个简单的项目。该项目由 2 个类组成,一个继承自另一个。

我希望将数据存储在单独的表中,但 EF 4 的默认设置是将这两个实体映射/存储在同一个表中。

使用.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; }
}

【问题讨论】:

    标签: entity-framework entity code-first


    【解决方案1】:

    不太了解 CTP4,但在 CTP5 中,这可以使用 .Map(x=&gt;x.ToTable("TableName")) 来完成,这是您想要的示例:

    public class Mammal
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    
    public class Animal : Mammal
    {
        public int NumberOfLegs { get; set; }
    }
    
    public class ZooContext : DbContext
    {
        public DbSet<Mammal> Mammals { get; set; }
        public DbSet<Animal> Animals { get; set; }
    
        protected override void OnModelCreating(ModelBuilder builder)
        {
            builder.Entity<Mammal>()
                .Map<Animal>(x => x.ToTable("Animals"))
                .Map<Mammal>(x => x.ToTable("Mammals"));
    
            base.OnModelCreating(builder);
        }
    } 
    
    class Program
    {
        static void Main()
        {
            DbDatabase.SetInitializer(new DropCreateDatabaseIfModelChanges<ZooContext>());
    
            using (var ents = new ZooContext())
            {
                ents.Mammals.Add(new Animal { Name = "First Mutant Animal", NumberOfLegs = 10 });
                ents.Mammals.Add(new Mammal { Name = "First Mammal" });
                ents.Mammals.Add(new Mammal { Name = "Second Mammal" });
                ents.SaveChanges();
            }
        }
    }
    

    PS:我使用 SqlCe 4.0 作为数据库引擎。如果Mammal 类只有Id 而没有其他属性(不知道为什么),这将无法启动。所以我添加了Name 属性基类。我不确定这是 CTP4、SqlCe 4.0 中的问题,或者我只是不知道。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-06-27
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多