多读几遍,明白我在正确提问时不太好。对问题做了一些修改。
我的应用中有2个课程:Contractor
和ContractorGroup
。
每个Contractor
都有一个父Contractor
。父Contractor
只能看到它的家属。并且看不到它的家属的家属。只有一个级别的可见性。
家长Contractor
可以将其依赖Contractors
归入ContractorGroup
。
因此,许多Contractors
依赖ContractorGroup
(多对一)
Contractor
有一个NavProperty ContractorGroup
,它所属的组。每个Contractor
只能在一个ContractorGroup
。
示例:
我是父Contractor
并且有5个依赖Contractors
,我想将其中的前2个分组为第1 ContractorGroup
和最后3到第2 ContractorGroup
。
所以,实施的选项:
首先: 我无法在连接的VisibleToContractorId
中添加FK(Contractor
- 我的父ContractorGroup
的ID)父母Contractor
的两组中的每一组
在这种情况下,我可以进行类似的查询:
var ContractorGroupsToDispalayForParentContractor =
context.ContractorGroups.Where(p => p.Contractors.All(p => p.Parent == ParentContractor));
换句话说:“查找所有由承包商组成的组,父母为== ParentContractor”
在这个选项中一切正常。 DbSchema简单明了。但我不喜欢这个问题。
第二: 或者我可以介绍FK(VisibleToContractorId
)。因此,一个父Contractor
有许多ContractorGroups
,其中包含从属Contractors
。然后我有一个更简单,更健壮的查询:
var ContractorGroupsToDispalayForParentContractor =
context.ContractorGroups.Where(p => p.VisibleToContractor == ParentContractor);
这个查询我喜欢。但EF引入了奇怪的DbColumn,它总是null
。 >: - 电子
短数据库架构:
Table("Contractor")
ContractorId = PK
ContractorGroupId = FK
ContractorGroup_ContractorGroupId = FK <--- This One
Table("ContratorGroup")
ContractorGroupId = PK
VisibleToContractorId = FK
我的域类和实体配置:
public class Contractor : IObjectWithState
{
[Key]
public virtual int ContractorId { get; set; }
public virtual Contractor Parent { get; set; }
public virtual int? ParentId { get; set; }
public virtual ContractorGroup ContractorGroup { get; set; }
public virtual int? ContractorGroupId { get; set; }
public virtual ICollection<ContractorGroup> GroupsVisible { get; set; }
}
public class ContractorGroup : IObjectWithState
{
[Key]
public virtual int ContractorGroupId { get; set; }
public virtual Contractor VisibleToContractor { get; set; }
public virtual int? VisibleToContractorId { get; set; }
public virtual ICollection<Contractor> Contractors { get; set; }
}
实体配置(仅限于ContractorGroupConfiguration
):
HasMany(p => p.Contractors).WithOptional(p=>p.ContractorGroup);
HasOptional(p => p.VisibleToContractor).WithMany(
p=>p.GroupsVisible).HasForeignKey(p=>p.VisibleToContractorId);
这是EF中的错误吗? 您更喜欢哪种实施 第一 或 第二 ?
感谢。
答案 0 :(得分:0)
关键是你需要告诉EF关联ContractorGroup.VisibleToContractor
和Contractor.GroupsVisible
不是独立的关联(有两个FK字段),而是双向关联的两个部分。通过以下方式替换实体配置:
class ContractorConfiguration : EntityTypeConfiguration<Contractor>
{
public ContractorConfiguration()
{
HasMany(c => c.GroupsVisible).WithOptional(g => g.VisibleToContractor);
}
}
如果不这样做,EF会在FK ContractorGroup_ContractorGroupId
之上为Contractor.GroupsVisible
创建字段VisibleToContractorId
作为FK。