实体框架:处理两个实体之间的多个关系

本文关键字:实体 之间 关系 两个 处理 框架 | 更新日期: 2023-09-27 18:26:07

有两个实体:

  1. Yuvak-个人

"其他"人是在后台设计的,没有团队。(空)

一个尤瓦克人总是有一个家庭小组。(1=>1)并且将没有要控制的组。

一个Nirikshak(首领)-人总是有一个家庭小组。(1=>1)但他也将有多个小组要控制——尼里克沙克小组。(1=>许多)

一个组将有多个Yuvak(1=>多个)

并且大多数情况下,所有组都只有一个Head。(最初,一个新的群体可能没有任何头脑,但没有或更多的尤瓦克斯人。)

[Table("Group")]
public class Group
{
    [Key]
    public int Id { get; set; }
    .....       
    public virtual List<Yuvak> Yuvaks { get; set; }
    [ForeignKey("Nirikshak")]
    public int? NirikshakId { get; set; }
    public virtual Yuvak Nirikshak { get; set; }
}
[Table("Yuvak")]
public class Yuvak
{
    [Key]
    public int Id { get; set; }
    .....
    [ForeignKey("HomeGroup")]
    public int? HomeGroupId { get; set; }
    public virtual Group HomeGroup { get; set; }
    public virtual List<Group> GroupsOfNirikshak { get; set; }
}

我已经为两个实体中的1=>1关系(可以为null)提供了两个外键。现在,为了管理多对多关系,如果"Yuvak_Id"answers"Group_Id"列不为空,它应该自动创建第三个表。但是在这里FK是空的;它没有创建第三个表,而是在两个表中都添加了一个外键列。(组:"Yuvak_Id"和Yuvak:"Group_Id")

我应该怎么做才能维护Yuvak HomeGroup,它应该只使用上面提供的外键,对于多对多关系(Head GroupsOfNirikshak&Group Yuvaks),它应该创建一个单独的表。

我可以为多对多关系创建一个单独的表吗?比如:(ID,YuvakID,GroupID)我该怎么做?

我试着这样做,但得到了不同的错误如下:

  1. 类型上声明的导航属性"HomeGroup"YTKGoshthiManagment.Models.Yuvak"已配置为冲突的外键
  2. 多重性在中的角色"Yuvak_HomeGroup_Target"中无效关系"Yuvak_HomeGroup"。因为从属角色属性不是关键属性Dependent Role的多重性必须为"*"

等等。

实体框架:处理两个实体之间的多个关系

使用"Fluent Api"!

在你的上下文类中写(例如):

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     modelBuilder.Entity<Group>()
                 .HasOptional(t => t.Nirikshak)
                 .WithMany(t => t.GroupsOfNirikshak)
                 .HasForeignKey(t => t.NirikshakId);
}

您可以删除类和属性上的注释。一旦你在另一个类上有了一个基于模型的类,实体框架就会自动在它上面创建一个外键关系。它会将Yuvak作为Group Graph对象上的一个节点来处理。您不需要声明注释,因为EF会自动为您声明。