2010-07-28 7 views
8

Mit EF Code Erste CTP 4 Ich habe ein einfaches Projekt erstellt. Dieses Projekt besteht aus 2 Klassen, von denen eine geerbt wurde.Entity Framework 4 - Code Zuerst die geerbte Tabelle nicht getrennt von der Basistabelle speichern

Ich möchte die Daten in separaten Tabellen speichern, aber der Standard von EF 4 ist, diese beiden Entitäten in derselben Tabelle abzubilden/zu speichern.

Mit .ToTable() kann ich dieses Verhalten ändern, aber damit habe ich einen Nebeneffekt: Wenn ich ein vererbtes Objekt behalte, beharrt EF nicht die gemeinsamen Werte (z. B. Id) auf der Basisklasse.

Ich bin sicher, dass ich gehe, um einige Informationen im Mapping zu setzen, aber nicht wissen, welche.

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

Antwort

1

wissen CTP4 nicht wirklich, aber in CTP5 kann dies hier mit .Map(x=>x.ToTable("TableName")) geschehen ist Beispiel dafür, was Sie wollen:

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: Ich SqlCe 4.0 als Datenbank-Engine verwendet. Dies kann nicht gestartet werden, wenn Mammal Klasse nur Id und keine anderen Eigenschaften hat (weiß nicht warum). Also habe ich Name Eigenschaft Basisklasse hinzugefügt. Ich bin mir nicht sicher, ob es ein Problem in CTP4, SqlCe 4.0 ist, oder ich weiß einfach nichts.

Hoffe, das hilft.