Entity Framework 4 - Code First не хранит унаследованную таблицу отдельно от базовой таблицы - PullRequest
8 голосов
/ 28 июля 2010

С EF Code First CTP 4 я создал простой проект. Этот проект состоит из 2 классов, один унаследован от другого.

Я хочу хранить данные в отдельных таблицах, но по умолчанию EF 4 отображает / хранит эти два объекта в одной таблице.

С помощью .ToTable() я могу изменить это поведение, но с этим у меня возникает побочный эффект: когда я сохраняю объект Inherited, 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; }
}

1 Ответ

1 голос
/ 09 декабря 2010

Не совсем знаю о CTP4, но в CTP5 это можно сделать, используя .Map(x=>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 или я просто что-то не знаю.

Надеюсь, это поможет.

...