首页 文章

EF在同一主键上有多个外键关系

提问于
浏览
1

我想使用EF 6使用代码优先方法创建多对多关系 . 我的实体使用复合主键(处理多租户) .

让我们来看一些简单而经典的例子 . 我有两个实体 ProjectPerson ,它们具有多对多的关系:

public class Person
{
   [Key, Column(Order = 1),]
   public Int32 Id { get; set; } 
   [Key, Column(Order = 2)]
   public int TenantId { get; set; }
   public string Name { get; set; }
}

public class Project
{
   [Key, Column(Order = 1),]
   public Int32 Id { get; set; } 
   [Key, Column(Order = 2)]
   public int TenantId { get; set; }
   Public string Name { get; set; }
}

我也有一个加入表 ProjectPerson 这样:

上面我定义了一个 ProjectProjectPerson 的关系 . 注意公共类ProjectPerson {[Key,Column(Order = 1),] public Int32 Id {get;组; } [Key,Column(Order = 2)] [ForeignKey("Project")] public int TenantId {get;组; }

[ForeignKey("Project")]
   public int ProjectId { get; set; }

   public DateTime AddedDate{ get; set; }

   public virtual Project Project { get; set; }
}

TenantId 用作主键和外键的一部分 .

到目前为止,该模型按预期工作 . 但是缺少 PersonProjectPerson 的关系 .

我在 ProjectPerson 类中添加了以下两行

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

  public virtual Person Person { get; set; }

肯定没有映射到 TenantId . 我不知道如何定义它

Update

我找到了这个 . 但仍然不满意,因为有额外的TenantId( PersonTenantId )作为外键 .

public class ProjectPerson
 {
   [Key, Column(Order = 1),]
   public Int32 Id { get; set; } 
   [Key, Column(Order = 2)]
   [ForeignKey("Project")]
   public int TenantId { get; set; }

   [ForeignKey("Project")]
   public int ProjectId { get; set; }

   [ForeignKey("Person")]
   public int PersonId { get; set; }
   [ForeignKey("Person")]
   public int PersonTenantId { get; set; } // duplicate 


   public DateTime AddedDate{ get; set; }

   public virtual Project Project { get; set; }
   public virtual Person Person { get; set; }

}

1 回答

  • 1

    使用fluent API为联结表中的两个FK重用 TentantId 列 . ProjectId 也应该包含在联结表的PK中 . 请注意,我修改了复合主键列的顺序,以将 TenantId 作为第一列 .

    public class Person
        {
            [Key, Column(Order = 0)]
            public int TenantId { get; set; }
            [Key, Column(Order = 1)]
            public int PersonId { get; set; }
    
            public string Name { get; set; }
    
            public virtual ICollection<ProjectPerson> ProjectPeople { get; set; }
        }
    
        public class Project
        {
            [Key, Column(Order = 0)]
            public int TenantId { get; set; }
            [Key, Column( Order = 1 )]
            public int ProjectId { get; set; }
    
            public string Name { get; set; }
    
            public virtual ICollection<ProjectPerson> ProjectPeople { get; set; }
        }
    
        public class ProjectPerson
        {
            [Key, Column( Order = 0 )]
            public int TentantId { get; set; }
            [Key, Column( Order = 1 )]
            public int ProjectId { get; set; }
            [Key, Column( Order = 2 )]
            public int PersonId { get; set; }
    
            public DateTime AddedDate { get; set; }
    
            public virtual Project Project { get; set; }
            public virtual Person Person { get; set; }
        }
    
    
        protected override void OnModelCreating( DbModelBuilder modelBuilder )
        {
            base.OnModelCreating( modelBuilder );
    
            modelBuilder.Entity<Project>()
                .HasMany(pr => pr.ProjectPeople )
                .WithRequired( pp => pp.Project )
                .HasForeignKey( pp => new { pp.TentantId, pp.ProjectId } );
    
            modelBuilder.Entity<Person>()
                .HasMany( pe => pe.ProjectPeople )
                .WithRequired( pp => pp.Person )
                .HasForeignKey( pp => new { pp.TentantId, pp.PersonId } );
        }
    

相关问题