2014-11-14 49 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