2010-07-28 16 views
8

Con EF Code First CTP 4 he creado un proyecto simple. Este proyecto consta de 2 clases, una heredada de otra.Entity Framework 4 - Code First no almacena la tabla heredada separada de la tabla base

Deseo almacenar los datos en tablas separadas, pero el valor predeterminado de EF 4 es asignar/almacenar estas dos entidades en la misma tabla.

Con .ToTable(), puedo cambiar este comportamiento, pero con esto tengo un efecto secundario: cuando persisto en un objeto heredado, EF no conserva los valores comunes (por ejemplo, Id) en la clase base.

Estoy seguro de que me voy a establecer algo de información en el mapeo pero no sé cuál.

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; } 
} 

Respuesta

1

no se sabe muy bien sobre CTP4, pero en CTP5 esto se puede hacer usando .Map(x=>x.ToTable("TableName")) aquí es ejemplo de lo que quiere:

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: He utilizado SQLCE 4.0 como motor de base de datos. Esto no se inicia, si la clase Mammal tiene solo Id y no tiene otras propiedades (No sé por qué). Así que agregué la clase base de la propiedad Name. No estoy seguro de que el clima sea un problema en CTP4, SqlCe 4.0, o simplemente no sé algo.

Espero que esto ayude.

Cuestiones relacionadas