0

我正在尝试提出一个管理人员及其朋友的模型。

  • 一个人有 0 对多的朋友
  • 朋友也是一个人——虽然不是同一个
  • 朋友可以属于一个或多个组

大致来说,架构看起来像这样:

在此处输入图像描述

我无法弄清楚如何使用 EF Code First 来实现相同的目标。这是我到目前为止所拥有的,但这并没有创建所需的架构

public class Person 
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public virtual ICollection<Person> Friends { get; set; } // is this right?
}

public class Friend {
    public long Id { get; set; }
    public long PersonId { get; set; }  // Person whose Friend this guy is
    public virtual ICollection<Group> Groups { get; set; } 

    // other fields 
}

public class Group{
    public long Id { get; set; }
    public string Name { get; set; }
}

有人可以帮我弄清楚这个烂摊子吗?

4

1 回答 1

3

您需要自我引用多对多关系,Person因为您当前的模型允许每个人有很多朋友,但同时每个人只能与另一个人成为朋友。

尝试这个:

public class Person 
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public virtual ICollection<Person> FriendWith { get; set; } 
    public virtual ICollection<Person> FriendOf { get; set; } 
}

你可以添加这个 fluent-API 映射:

modelBuilder.Entity<Person>()
            .HasMany(p => p.FriendWith)
            .WithMany(p => p.FriendOf)
            .Map(m => {
                 m.MapLeftKey("PersonId");
                 m.MapRightKey("FriendId");
                 m.ToTable("PersonFriends");
            });

这可能看起来很奇怪,但 EF 中的关联构建了有向图 => 如果一个人 A 与一个人 B 是朋友,则它被认为是不同的关系,那么如果一个人 B 是一个人 A 的朋友。这些关系之一将被FriendWith收集和另一个将被FriendOf收集。

于 2012-10-05T06:33:18.610 回答