在第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项。
答案 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);