簡體   English   中英

實體框架:用於多對多關系的外鍵

[英]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屬性-該關系將根據類型推斷。
Class1IdsClass2Ids不指向另一個實體,不是導航屬性,並且不能由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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM