2014-11-14 53 views
8

我已經創建了具有指向同一類型的多個項目集合屬性的實體類型映射。換句話說,它反映了一個單獨的數據庫表,其中行被任意分組,使得一行可以出現在多個組中。實體框架代碼優先:如何將多個自引用許多一對多的關係

在下面的簡單示例中,Person類有BrothersSisters集合屬性也引用Person實體:

public class Person 
{ 
    public Person() 
    { 
     Brothers = new Collection<Person>(); 
     Sisters = new Collection<Person>(); 
    } 

    [Key] 
    public string Name { get; set; } 

    public int Age { get; set; } 

    public virtual ICollection<Person> Brothers { get; set; } 

    public virtual ICollection<Person> Sisters { get; set; } 
} 

實體框架似乎認爲這是一個有效的模式,但其解釋創建單身PersonPersons連接表,未能體現兄妹關係的分離。

我認爲,解決辦法是用流利的API顯式地映射單獨的連接表的兩個關係,但是,儘管有大量的實驗,我一直無法得到這個工作。

有什麼建議嗎?

感謝, 添

+1

你有沒有試過,HasMany(p => p.Brothers).WithMany(b => b.Persons).Map(m => m.Table(「Person_Brothers」);還沒有嘗試過這種類型的關係,但那我們如何U映射多對多時EF不會合作。 – trevorc 2014-11-14 14:09:03

回答

8

通過在DbContext.OnModelCreating方法添加此:

UPDATE根據nameEqualsPNamePrubeGoldberg的評論上述新增表命名地圖:

modelBuilder.Entity<Person>().HasMany(x => x.Brothers).WithMany() 
    .Map(x => x.ToTable("Person_Brothers")); 
modelBuilder.Entity<Person>().HasMany(x => x.Sisters).WithMany() 
    .Map(x => x.ToTable("Person_Sisters")); 

我得到這個單元測試通過

[TestMethod] 
public void TestPersons() 
{ 
    var brother = new Person() { Name = "Brother 1", Age = 10 }; 
    var sister = new Person() { Name = "Sister 1", Age = 12 }; 
    var sibling = new Person() { Name = "Sibling 1", Age = 18 }; 
    sibling.Brothers.Add(brother); 
    sibling.Sisters.Add(sister); 

    using (var db = new MyDatabase()) 
    { 
     db.Persons.Add(brother); 
     db.Persons.Add(sister); 
     db.Persons.Add(sibling); 

     db.SaveChanges(); 
    } 

    using (var db = new MyDatabase()) 
    { 
     var person = db.Persons 
      .Include(x => x.Sisters) 
      .Include(x => x.Brothers) 
      .FirstOrDefault(x => x.Name.Equals(sibling.Name)); 

     Assert.IsNotNull(person, "No person"); 
     Assert.IsTrue(person.Brothers.Count == 1, "No brothers!"); 
     Assert.IsTrue(person.Sisters.Count == 1, "No sisters"); 
    } 
} 

這也會創建您正在討論的鏈接表。

+1

這是一個很好的解決方案。謝謝。 – 2014-11-14 14:41:09

+0

與此代碼,你說'brother'是sibling'的'兄弟,對嗎?但你必須手動包括關係的另一面(告知'sibling'是brother'的'兄弟) – tyron 2014-12-17 21:39:48

+0

@tyron:是的,我想你是對 – 2014-12-18 14:43:29