2010-07-28 10 views
8

ईएफ कोड प्रथम सीटीपी 4 के साथ मैंने एक साधारण परियोजना बनाई है। इस परियोजना में 2 वर्ग होते हैं, जिन्हें दूसरे से विरासत में मिला है।इकाई फ्रेमवर्क 4 - कोड पहले आधार तालिका से अलग विरासत तालिका को संग्रहीत नहीं करता

मैं डेटा को अलग-अलग तालिकाओं में संग्रहीत करना चाहता हूं, लेकिन ईएफ 4 का डिफ़ॉल्ट एक ही तालिका में इन दो इकाइयों को मैप/स्टोर करना है।

.ToTable() के साथ, मैं इस व्यवहार को बदल सकता हूं, लेकिन इसके साथ मेरा दुष्प्रभाव होता है: जब मैं एक विरासत वस्तु को जारी रखता हूं, तो ईएफ बेस क्लास पर सामान्य मानों (पूर्व आईडी) को जारी नहीं रखता है।

मुझे यकीन है कि मैपिंग में कुछ जानकारी सेट करने के लिए जा रहा हूं लेकिन मुझे नहीं पता।

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

वास्तव में 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(); 
     } 
    } 
} 

पुनश्च: मैं डेटाबेस इंजन के रूप में SqlCe 4.0 इस्तेमाल किया। यह शुरू करने में विफल रहता है, अगर Mammal कक्षा में केवल Id है और कोई अन्य गुण नहीं है (क्यों नहीं पता)। तो मैंने Name संपत्ति बेस क्लास जोड़ा। मुझे यकीन नहीं है कि मौसम सीटीपी 4, एसक्यूएलसी 4.0 में समस्या है, या मुझे कुछ पता नहीं है।

उम्मीद है कि इससे मदद मिलती है।

संबंधित मुद्दे