[英]Entity Framework: foreign keys for many-to-many relations
我對多對多關系的導航屬性有疑問。 正如我在MSDN上閱讀的那樣,有一個選項可以將ForeignKey
屬性定義為導航屬性。 現在,我想將此功能用於多對多關系,但我無法使其正常工作。
我正在使用EF 6.1.3。
我的課程:
public class Class1
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[ForeignKey(nameof(Class2s))]
public ICollection<Guid> Class2Ids { get; set; }
[ForeignKey(nameof(Class2Ids))]
public ICollection<Class2> Class2s { get; set; }
[ForeignKey(nameof(Class3))]
public Guid Class3Id { get; set; }
public Guid Class3 { get; set; }
}
public class Class2
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[ForeignKey(nameof(Class1s))]
public ICollection<Guid> Class1Ids { get; set; }
[ForeignKey(nameof(Class1Ids))]
public ICollection<Class1> Class1s { get; set; }
}
public class Class3
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
}
導航屬性被加載但id集合保持為空的問題。
public static void Main(string[] args)
{
using (SomeContext context = new SomeContext())
{
var classes = context.Classe1Set
.Include(c => c.Class2s)
.Include(c => c.Class2s)
.First();
classes.Class3; // filled with correct object
classes.Class3Id; // filled with correct guid
classes.Class2s; // is filled with 2 elements
classes.Class2Ids; // problem: is Empty List
}
}
我究竟做錯了什么?
編輯:更新了類以更好地表示問題。 在數據庫端正確創建了多對多連接。 問題只是屬性Class1Ids無法正確填充,而Class3Id可以正確填充。
謝謝你的幫助。
您不需要ForeignKey屬性-該關系將根據類型推斷。
Class1Ids
和Class2Ids
不指向另一個實體,不是導航屬性,並且不能由EF自動加載。
要獲得所需的內容,您應該像這樣定義Ids屬性
public ICollection<Guid> ClassXIds { get { return ClassXs.Select(c => c.Id).ToList(); } }
public ICollection<Guid> ClassXIds { get { return ClassXs.Select(c => c.Id).ToList(); } }
。 這不會從數據庫加載數據,只是從導航屬性中提取ID。
在Class1之下,Class應該具有Class2的集合導航屬性,而Class2應該具有Class1的集合導航屬性,這將在Class1和Class2之間創建多對多關系,如下所示:
public class Class1
{
public Class1()
{
this.Courses = new HashSet<Course>();
}
public int Class1Id { get; set; }
public virtual ICollection<Class2> Class2s { get; set; }
}
public class Class2
{
public Class1()
{
this.Class1s = new HashSet<Class1>();
}
public int Class2Id { get; set; }
public virtual ICollection<Class1> Class1s { get; set; }
}
然后,您將在數據庫上獲得一個名為Class1Class2
的表,其中字段Class1_Class1Id作為主鍵,另一個Class2_Class2Id作為主鍵
默認情況下,EF將查找與主體實體主鍵名稱相同名稱的外鍵屬性。 如果不存在外鍵屬性,則EF將在Db表中使用+“ _” +創建FK列,例如,如果Class1實體不包含Class1的外鍵屬性(其中Class1包含Class1Id),則EF將在Class1表中創建Class1_Class1Id外鍵列
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.