Entity Framework : 处理两个实体之间的多重关系
Entity Framework : Handle multiple relationships between two entities
有两个实体:
- 组
- Yuvak - 人物
"Other"人是后台设计的,没有群。 (空)
一个 Yuvak - 一个人将始终拥有一个家庭组。 (1=>1) 并且没有要控制的组。
A Nirikshak(负责人)- 一个人将始终拥有一个家庭组。 (1=>1) 但他也将有多个组来控制 - GroupsOfNirikshak。 (1=>许多)
一个小组将有多个 Yuvaks(1=>许多)
而且所有的小组大多只有一个负责人。 (最初一个新组可能没有任何头,只有零个或多个 yuvaks-persons。)
[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 关系(可为空)提供了两个外键。
现在要管理多对多关系,它应该自动创建第三个 table 和 "Yuvak_Id" 和 "Group_Id" 列(如果它们不为空)。但是这里的 FK 是空的;它没有创建第三个 table,而是在 table 中添加了一个外键列。(组:"Yuvak_Id" 和 Yuvak:"Group_Id")
我应该怎么做才能维护 Yuvak-HomeGroup,它应该只使用上面提供的外键,对于多对多关系(Head-GroupsOfNirikshak 和 Group-Yuvaks),它应该创建一个单独的 table。
我可以为多对多关系创建单独的 table 吗:(ID,YuvakID,GroupID) 我该怎么做?
我尝试这样做,但出现了如下不同的错误:
- 导航 属性 'HomeGroup' 类型声明
'YTKGoshthiManagment.Models.Yuvak' 已配置
外键冲突。
- 多重性在角色 'Yuvak_HomeGroup_Target' 中无效
关系 'Yuvak_HomeGroup'。因为依赖角色
属性不是关键属性,
从属角色的多重性必须是“*”。
.....
等等。
您可以删除 类 和属性上的注释。一旦你在另一个上有基于模型的 Class,Entity Framework 将自动在其上创建外键关系。它将 Yuvak 作为 Group Graph 对象上的一个节点进行处理。您无需声明注释,因为 EF 会自动为您执行此操作。
使用 "Fluent Api" !
在你的上下文中class写(例如):
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Group>()
.HasOptional(t => t.Nirikshak)
.WithMany(t => t.GroupsOfNirikshak)
.HasForeignKey(t => t.NirikshakId);
}
有两个实体:
- 组
- Yuvak - 人物
"Other"人是后台设计的,没有群。 (空)
一个 Yuvak - 一个人将始终拥有一个家庭组。 (1=>1) 并且没有要控制的组。
A Nirikshak(负责人)- 一个人将始终拥有一个家庭组。 (1=>1) 但他也将有多个组来控制 - GroupsOfNirikshak。 (1=>许多)
一个小组将有多个 Yuvaks(1=>许多)
而且所有的小组大多只有一个负责人。 (最初一个新组可能没有任何头,只有零个或多个 yuvaks-persons。)
[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 关系(可为空)提供了两个外键。 现在要管理多对多关系,它应该自动创建第三个 table 和 "Yuvak_Id" 和 "Group_Id" 列(如果它们不为空)。但是这里的 FK 是空的;它没有创建第三个 table,而是在 table 中添加了一个外键列。(组:"Yuvak_Id" 和 Yuvak:"Group_Id")
我应该怎么做才能维护 Yuvak-HomeGroup,它应该只使用上面提供的外键,对于多对多关系(Head-GroupsOfNirikshak 和 Group-Yuvaks),它应该创建一个单独的 table。
我可以为多对多关系创建单独的 table 吗:(ID,YuvakID,GroupID) 我该怎么做?
我尝试这样做,但出现了如下不同的错误:
- 导航 属性 'HomeGroup' 类型声明 'YTKGoshthiManagment.Models.Yuvak' 已配置 外键冲突。
- 多重性在角色 'Yuvak_HomeGroup_Target' 中无效 关系 'Yuvak_HomeGroup'。因为依赖角色 属性不是关键属性, 从属角色的多重性必须是“*”。
.....
等等。
您可以删除 类 和属性上的注释。一旦你在另一个上有基于模型的 Class,Entity Framework 将自动在其上创建外键关系。它将 Yuvak 作为 Group Graph 对象上的一个节点进行处理。您无需声明注释,因为 EF 会自动为您执行此操作。
使用 "Fluent Api" !
在你的上下文中class写(例如):
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Group>()
.HasOptional(t => t.Nirikshak)
.WithMany(t => t.GroupsOfNirikshak)
.HasForeignKey(t => t.NirikshakId);
}