![](/img/trans.png)
[英]Entity Framwork: Why is my entity's collection property empty with LazyLoadingEnabled = false?
[英]Entity Framwork 5: Why is my entity's collection property empty?
我目前正在通過Code First方法學習實體框架(EF)。 我想在一個新創建的數據庫(即由EF創建)上模擬Professor
和Class
之間的簡單的一對多關系。
在我的模型中, Professor
有一系列Class
。 一個Class
總是有一個與之相關的Professor
(即相應的屬性永遠不為空)。 我可以創建和存儲一個Class
和一個相關的Professor
,但是當我訪問從數據庫中檢索到的Professor
的Classes
屬性時,它是空的。 然而,從一個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,則“查詢”存儲在內存中的本地實體,而不是數據庫。
在第一個上下文中,您不需要將professor
和class
都添加到上下文中。 只需添加教授, 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.