首页 > 解决方案 > 在模型中创建与其自身的多对多关系

问题描述

我正在尝试制作一个join仅处理一个模型的正确表,我计划为该表设置我计划稍后使用的 CRUD 页面,因此我相信它不能成为原始模型的一部分。

public class Person
{
  [Key]
  public int PersonID { get; set;}

  public string Firstname { get; set;}
  public string LastName { get; set;}
  public string Birthday { get; set;}
}

现在我想跟踪人们、他们最好的朋友以及他们最好的朋友的生日是什么。

public class Friends
{
  [Key]
  public int FriendshipID {get; set;}

  [ForeignKey("Person")]
  public Person SelectedPerson {get; set;}
  public int SelectedPersonID {get; set;}

  [ForeignKey("Person")]
  public Person Friend {get; set;}
  public int FriendID {get; set;}
}

这有一些问题,我不完全知道它是如何[ForeignKey("xxxx")]工作的,但这似乎会导致错误。一个人可能有多个最好的朋友,所以我必须在朋友表中有很多条目,SelectedPerson为了得到他们所有最好的朋友,我觉得如果有一个好方法可以得到一个他们的朋友列表,而不仅仅是一个单一的朋友,这将有一个优势,但似乎会导致某种级联删除错误?

我知道在 stackoverflow 上有与此类似的问题,但我找不到它加入同一个表的任何地方,我目前已将 ForeignKeys 注释掉,因为 EF 无法处理同名的外键。

非常感谢任何帮助/建议,感谢您的宝贵时间。

标签: c#asp.netasp.net-mvcentity-framework

解决方案


您应该使用InversePropertyin 父类来定义多个关系

并且不要使用重复的名称ForeignKey

public class Person
{
  [Key]
  public int PersonID { get; set;}

  public string Firstname { get; set;}
  public string LastName { get; set;}
  public string Birthday { get; set;}

  [InverseProperty("SelectedPerson")]
  public ICollection<Friends> SelectedPerson { get; set; }

  [InverseProperty("Friend")]
  public ICollection<Friends> SelectedFriends { get; set; }
}

然后将Friends课程更改为此

public class Friends
{
  [Key]
  public int FriendshipID {get; set;}

  [ForeignKey("SelectedPersonID")]
  public Person SelectedPerson {get; set;}
  public int SelectedPersonID {get; set;}

  [ForeignKey("FriendID")]
  public Person Friend {get; set;}
  public int FriendID {get; set;}
}

推荐阅读