如果您有多個導航屬性引用同一個實體,EF不知道其他實體的逆導航屬性屬於哪裏。在你的例子中:A.ObjectsOfB
是指B.ObjectA
還是B.OtherObjectsOfA
?兩者都是可能的,而且是有效的模型。
現在,EF不會拋出像「無法明確確定關係」之類的異常。相反,它決定B.ObjectA
引用B
中的第三個端點,該模型中未顯示導航屬性。這將在表B
中創建第一個外鍵。 B
中的兩個導航屬性指的是A
中的兩個端點,它們在模型中也未公開:B.ObjectA
創建表B
中的第二個外鍵,B.OtherObjectsOfA
在表A
中創建外鍵。
要解決此問題,您必須明確指定關係。
選項之一(最簡單的方法)是使用InverseProperty
屬性:
public class A
{
public int Id { get; set; }
public string Name { get; set; }
[InverseProperty("OtherObjectsOfA")]
public virtual ICollection<B> ObjectsOfB { get; set; }
}
這定義了A.ObjectsOfB
是許多一對多關係B.OtherObjectsOfA
的一部分。
另一種選擇是,以流利的API完全定義的關係:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<A>()
.HasMany(a => a.ObjectsOfB)
.WithMany(b => b.OtherObjectsOfA)
.Map(x =>
{
x.MapLeftKey("AId");
x.MapRightKey("BId");
x.ToTable("ABs");
});
modelBuilder.Entity<B>()
.HasRequired(b => b.ObjectA) // or HasOptional
.WithMany()
.WillCascadeOnDelete(false); // not sure if necessary, you can try it
// without if you want cascading delete
}
謝謝你的回答!但是,對於這兩種解決方案,我都會得到以下異常:'在EntityFramework.DLL中發生'System.InvalidOperationException'類型的第一次機會異常' – Marthijn
更正:流暢的解決方案(我的錯誤..),非常感謝!任何想法爲什麼'InverseProperty'引發異常? – Marthijn
@Henkie:應用程序真的崩潰嗎? 「第一次機會異常」通常不是問題,只在調試器輸出窗口中顯示。通常它可以被忽略。 – Slauma