实体框架:处理两个实体之间的多个关系
本文关键字:实体 之间 关系 两个 处理 框架 | 更新日期: 2023-09-27 18:26:07
有两个实体:
- 组
- 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)我该怎么做?
我试着这样做,但得到了不同的错误如下:
- 类型上声明的导航属性"HomeGroup"YTKGoshthiManagment.Models.Yuvak"已配置为冲突的外键
- 多重性在中的角色"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会自动为您声明。