从一个实体到另一个实体的多个引用,数据库模式,实体框架

时间:2012-11-09 05:06:00

标签: entity-framework database-schema


多读几遍,明白我在正确提问时不太好。对问题做了一些修改。

我的应用中有2个课程:ContractorContractorGroup

  1. 每个Contractor都有一个父Contractor。父Contractor只能看到它的家属。并且看不到它的家属的家属。只有一个级别的可见性。

  2. 家长Contractor可以将其依赖Contractors归入ContractorGroup

    因此,许多Contractors依赖ContractorGroup(多对一) Contractor有一个NavProperty ContractorGroup,它所属的组。每个Contractor只能在一个ContractorGroup

  3. 示例: 我是父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中的错误吗? 您更喜欢哪种实施 第一 第二

    感谢。

1 个答案:

答案 0 :(得分:0)

关键是你需要告诉EF关联ContractorGroup.VisibleToContractorContractor.GroupsVisible不是独立的关联(有两个FK字段),而是双向关联的两个部分。通过以下方式替换实体配置:

class ContractorConfiguration : EntityTypeConfiguration<Contractor>
{
    public ContractorConfiguration()
    {
        HasMany(c => c.GroupsVisible).WithOptional(g => g.VisibleToContractor);
    }
}

如果不这样做,EF会在FK ContractorGroup_ContractorGroupId之上为Contractor.GroupsVisible创建字段VisibleToContractorId作为FK。