0

我已經踢上ADO EF代碼第一次輪胎,並拿出了以下問題:ADO EF代碼第一次雙向許多一對多的自我參照的挑戰

我的模型很簡單,代表一個家庭樹。 它由一個具有幾個標量屬性的人物類名字等組成, 表示父母的人物集合和 另一個表示兒童人物集合。

public class Person 
{ 
    public int id { get; set; } 
    public string FirstName { get; set; } 
    public string MiddleName { get; set; } 
    public string LastName { get; set; } 
    public DateTime? DateOfBirth { get; set; } 

    List<Person> children = new List<Person>(); 
    public IList<Person> Children { get { return children; } set { children = (List<Person>)value; } } 

    List<Person> parents = new List<Person>(); 
    public IList<Person> Parents { get { return parents; } set { parents = (List<Person>)value; } } 
} 

上下文代碼非常簡單

public class DataContext : DbContext 
{ 
    public DbSet<Person> People { get; set; } 
} 

時生成爲預期的數據庫架構。 人員表與2個名爲PersonPersons的表的一對多關係。 (順便說一下,是否有改變這個名爲FamilyTree的表?)

然後,我開始使用一些數據種子數據庫,這是一個流行的辛普森卡通節目的家譜。 我創建了我需要的所有人,將它們關聯起來,然後保存代表Homer Simpson的人物變量。

class ProjectDBInitializer : DropCreateDatabaseIfModelChanges<DataContext> 
{ 
    protected override void Seed(DataContext context) 
    { 
     Person ph = new Person() { FirstName = "Homer", LastName = "Simpson" }; 
     Person pm = new Person() { FirstName = "Marge", LastName = "Simpson" }; 

     Person pb = new Person() { FirstName = "Bart", LastName = "Simpson" }; 
     Person pl = new Person() { FirstName = "Lisa", LastName = "Simpson" }; 

     Person phf = new Person() { FirstName = "GranPa", LastName = "Simpson" }; 
     Person phm = new Person() { FirstName = "GranMa", LastName = "Simpson" }; 

     Person pmf = new Person() { FirstName = "Marge Father", LastName = "Maiden" }; 
     Person pmm = new Person() { FirstName = "Marge Mother", LastName = "Maiden" }; 

     phf.Children.Add(ph); 
     phm.Children.Add(ph); 

     ph.Children.Add(pb); 
     ph.Children.Add(pl); 

     pb.Parents.Add(ph); 
     pb.Parents.Add(pm); 

     pl.Parents.Add(ph); 
     pl.Parents.Add(pm); 

     pm.Parents.Add(pmf); 
     pm.Parents.Add(pmm); 

     context.People.Add(ph); 
     context.SaveChanges(); 
    } 
} 

當我看着數據庫中發生了什麼時,問題就會出現。

已經插入了所有Marge的家庭,但荷馬的父母(GranPa和GranMa)沒有。 我認爲這與這個事實有關,即即使他們在他們的Children集合中引用它,ph varibale也沒有提及它們。

什麼是解決這個問題最好的(最簡單的)方法?

+0

我已經注意到更多要添加到拉迪斯拉夫的答案,請閱讀並接受它作爲答案:) – 2011-04-22 22:02:16

回答

2

要reneme表必須添加流利的映射到您的上下文:

public class DataContext : DbContext 
{ 
    public DbSet<Person> People { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<Person>() 
      .HasMany(p => p.Children) 
      .WithMany(c => c.Parents) 
      .Map(m => m.ToTable("FamilyTree")); 
    } 
} 

與插入的問題是完全按照你描述。如果您想插入荷馬,您必須將phf和phm設置爲他的父母,或者您必須將phm和phf添加到與您添加荷馬相同的方式設置的人。

自動生成的POCO對象(用於從EDMX生成POCO的T4模板)使用更復雜的導航屬性代碼,並且它們在內部處理關係修正,因此如果您在phm中將Homer添加到子集合中,它將自動將phm添加到Homer父母。如果你想在你自己的POCO中使用這樣的功能,你必須自己實現它。修正方法並不總是雙贏的解決方案,因爲它們有一些缺點,有時會觸發延遲加載而無需加載數據。

+0

+1尼斯答案:) – 2011-04-22 22:00:34

+0

非常感謝您的答覆。這是我擔心的!我需要編寫更多的代碼。我研究了POCO類正在做什麼,將它放到模板中是有意義的。這是重複和無聊:)這就是說我驚訝的代碼第一引擎沒有提供任何處理proplem看到它正確地傳遞了關係,當然它可以實現某種圖形遍歷來修復關係之前致力於D B。我會自己試一試。乾杯。 – Hugo 2011-04-23 16:20:34

相關問題