交叉在EF代码中包含相同的表关系引发错误违反多重性约束

时间:2019-01-17 10:13:16

标签: c# entity-framework

在第3个对象中,我与同一张桌子有交叉关系。 当我尝试插入新对象时,出现错误:

  

违反多重性约束。角色   关系的“ OrgOwners_Organisation_Target”   “ GBankDataSource.OrgOwners_Organisation”的多重性为1或0..1。

我尝试在任何类中注释[ForeignKey("...")],但是什么也没有发生。 EF始终选择一个字段(此示例中为OrgRefID)并使用它或同时使用这两个关系,而没有使用OrgID。

public class OrganisationInfo
{
    [Key]
    public int OrgID { get; set; }
...
    public virtual List<OrgOwners> OrgOwners { get; set; } // object that throws error 

}


public class OrgOwners
{
    [Key]
    public int OrgOwnerID { get; set; }

    public int OrgID { get; set; } //Suppose to be a ForeignKey for (OrganisationInfo OrgOwners List)
    public int? OrgRefID { get; set; }
...
    [ForeignKey("OrgRefID")]
    public virtual OrganisationInfo Organisation { get; set; } //(Suppose to use OrgRefID as ForeignKey)

}

当我向没有组织( Organisation =null)的OrgOwners添加记录时-可以。但是当我这样做

var first = new OrganisationInfo(); //第一个组织DB.OrganisationInfoes.Add(first);

var nextOrg = new OrganisationInfo(); //第二机构

first.OrgOwners = new list();

var Owner = new OrgOwners(); Owner.Organsiation = nextOrg;

first.OrgOwners.Add(Owner); //将拥有者和第二个组织添加到第一个组织中。

我出错了。

  

违反多重性约束。

OrgOwner.Organisation-与OrgOwners列表的根目录中的组织信息不同。它必须是与OrgRefID ForeignKey相关的其他OrganisationInfo项。

2 个答案:

答案 0 :(得分:1)

这是因为默认情况下,EF在可能的情况下自动“配对”导航属性以形成关系。在您的情况下,它将OrganizationInfo.OrgOwners集合导航属性与OrgOwners.Organization参考导航属性配对,因此获取并使用与其关联的OrgRefID FK。

解决此问题的一种方法是向OrgOwners添加第二个参考导航属性,并通过OrgID属性 {通过ForeignKey属性的{1}}集合导航属性:

OrganizationInfo.OrgOwners

要做到这一点而无需更改实体模型,您应该通过fluent API配置关系:

InverseProperty

答案 1 :(得分:0)

完整的示例:

public class OrganisationInfo
{
    [Key]
    public int OrgID { get; set; }
    public virtual List<OrgOwners> OrgOwners { get; set; } 

}

public class OrgOwners
{
    [Key]
    public int OrgOwnerID { get; set; }
    public int OrgID { get; set; }
    public int? OrgRefID { get; set; }

    [ForeignKey("OrgRefID")]
    public virtual OrganisationInfo Organisation { get; set; } 

}



modelBuilder.Entity<OrganisationInfo>()
                    .HasMany(e => e.OrgOwners)
                    .WithRequired() 
                    .HasForeignKey(e => e.OrgID);