我想使用EF 6使用代码优先方法创建多对多关系 . 我的实体使用复合主键(处理多租户) .
让我们来看一些简单而经典的例子 . 我有两个实体 Project
和 Person
,它们具有多对多的关系:
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
这样:
上面我定义了一个 Project
到 ProjectPerson
的关系 . 注意公共类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
用作主键和外键的一部分 .
到目前为止,该模型按预期工作 . 但是缺少 Person
到 ProjectPerson
的关系 .
我在 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 回答
使用fluent API为联结表中的两个FK重用
TentantId
列 .ProjectId
也应该包含在联结表的PK中 . 请注意,我修改了复合主键列的顺序,以将TenantId
作为第一列 .