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

时间:2015-12-07 12:15:02

标签: c# entity-framework orm entity-framework-6 entity

有两个实体:

  1. 集团
  2. Yuvak - 人
  3. “其他”人设计在后端,没有任何组。 (空)

    Yuvak - 人总会有一个家庭组。 (1 => 1)并且没有任何组可以控制。

    Nirikshak(负责人) - 人总是有一个家庭组。 (1 => 1)但他也将有多个组来控制 - GroupsOfNirikshak。 (1 =>许多)

    一个小组将有多个Yuvaks(1 =>多个)

    所有团体大多只有一个团长。 (最初一个新组可能没有任何头,但零或多个yuvaks人。)

    [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 =&gt; 1个关系(可为空)提供了两个外键。 现在要管理多对多的关系,如果它们不为空,它应该自动创建一个带有“Yuvak_Id”和“Group_Id”列的第三个表。但是在这里,FK是空的;而不是创建第三个表,它在两个表中添加一个外键列。(组:“Yuvak_Id”和Yuvak:“Group_Id”)

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

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

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

    1. 在类型上声明的导航属性“HomeGroup” 'YTKGoshthiManagment.Models.Yuvak'已配置 冲突的外键。
    2. Multiplicity在角色'Yuvak_HomeGroup_Target'中无效 关系'Yuvak_HomeGroup'。因为依赖角色 属性不是关键属性,是上限 依赖角色的多样性必须为'*'。
    3. .....

      等等。

2 个答案:

答案 0 :(得分:1)

使用“Fluent Api”!

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

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

答案 1 :(得分:0)

您可以删除类和属性上的注释。一旦在另一个上有基于模型的类,Entity Framework将自动在其上创建外键关系。它将Yuvak作为Group Graph对象的节点进行处理。您无需声明注释,因为EF会自动为您执行此操作。