簡體   English   中英

實體框架5:為什么我的實體的集合屬性為空?

[英]Entity Framwork 5: Why is my entity's collection property empty?

我目前正在通過Code First方法學習實體框架(EF)。 我想在一個新創建的數據庫(即由EF創建)上模擬ProfessorClass之間的簡單的一對多關系。

在我的模型中, Professor有一系列Class 一個Class總是有一個與之相關的Professor (即相應的屬性永遠不為空)。 我可以創建和存儲一個Class和一個相關的Professor ,但是當我訪問從數據庫中檢索到的ProfessorClasses屬性時,它是空的。 然而,從一個Class導航到其Professor是可能的。

考慮以下模型:

class Class
{
    public int Id { get; set; }
    public string Title { get; set; }
    public virtual Professor Professor { get; set; }
}

class Professor
{
    public int Id { get; set; }
    public string Name { get; set; }
    private ICollection<Class> classes = null;

    public virtual ICollection<Class> Classes
    {
        get { return classes ?? (classes = new HashSet<Class>()); }
        set { classes = value; }
    }
}

class ClassManager : DbContext
{
    public DbSet<Professor> Professors { get; set; }
    public DbSet<Class> Classes { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Class>().HasRequired(c => c.Professor);
    }
}

在我的主要方法中,我創建並訪問我的數據,如下所示:

    using (ClassManager db = new ClassManager())
    {
        Professor p = new Professor() { Name = "McTest" };
        Class c = new Class() { Title = "Testing Tests", Professor = p };

        p.Classes.Add(c);

        db.Professors.Add(p);
        db.Classes.Add(c);

        Console.WriteLine(db.SaveChanges() + " change(s) saved.");
    }

    using (ClassManager db = new ClassManager())
    {
        foreach (Professor p in db.Professors)
            Console.WriteLine("Prof. " + p.Name + " gives " + p.Classes.Count 
                + " classes.");

        foreach (Class c in db.Classes)
            Console.WriteLine(c.Title + " (Prof. " + c.Professor.Name + ")");
    }

輸出是:

3 change(s) saved.
Prof. McTest gives 0 classes.
Testing Tests (Prof. McTest)

生成的數據庫架構是:

table Classes
    column Id (PK, int, not null)
    column Title (nvchar(max), null)
    column Professor_Id (FK, int, not null)
table Professors
    column Id (PK, int, not null)
    column Name (nvchar(max), null)

如您所見, Classes集合屬性不會出現在架構中的任何位置。 這是有意的嗎?

有人可以對此有所了解嗎? 我發現的所有示例都不會詳細介紹集合屬性。

好的,經過幾個小時的搜索,我找到了解決方案。 在查詢數據庫時,似乎必須明確指示EF加載實體的集合屬性:

foreach (Professor p in db.Professors.Include("Classes"))
    Console.WriteLine("Prof. " + p.Name + " gives " + p.Classes.Count
        + " classes.");

Include方法可以做到這一點。

在我的主代碼中使用兩個語句分隔是有意的。 如果我將它們合並在一起,Classes屬性突然不是空的,但我不明白為什么。

如果將2合並為1,則“查詢”存儲在內存中的本地實體,而不是數據庫。

在第一個上下文中,您不需要將professorclass都添加到上下文中。 只需添加教授, class也將保存。

檢查數據庫架構並確保實體已正確映射到數據庫。

最后,改變Professor課程

class Professor
{
    public Professor()
    {
         Classes = new List<Class>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Class> Classes {get; set;}
}

我懷疑延遲加載被is null邏輯打敗以返回一個散列集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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