2010-07-28 10 views
8

Con codice EF Primo CTP 4 Ho creato un progetto semplice. Questo progetto consiste di 2 classi, una ereditata dall'altra.Entity Framework 4 - Codice Prima non memorizzare tabella ereditata separata dalla tabella di base

Desidero memorizzare i dati in tabelle separate, ma l'impostazione predefinita di EF 4 è quella di mappare/memorizzare queste due entità nella stessa tabella.

Con .ToTable(), posso modificare questo comportamento, ma con questo ho un effetto collaterale: quando continuo un oggetto ereditato, EF non mantiene i valori comuni (es. Id) sulla classe base.

Sono sicuro che me ne vado per impostare alcune informazioni nella mappatura ma non so quale.

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

risposta

1

in realtà non conoscono CTP4, ma in CTP5 questo può essere fatto utilizzando .Map(x=>x.ToTable("TableName")) qui è esempio di ciò che si vuole:

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: ho usato SQLCE 4.0 come motore di database. Questo non riesce a iniziare, se la classe Mammal ha solo Id e nessun'altra proprietà (non so perché). Così ho aggiunto Name classe base di proprietà. Non sono sicuro che sia un problema in CTP4, SqlCe 4.0, o semplicemente non so qualcosa.

Spero che questo aiuti.

Problemi correlati