C# 实体框架5:为什么我的实体是';s集合属性为空?
我目前正在通过代码优先的方法学习实体框架(EF)。我想在一个新创建的数据库(即EF创建的数据库)上,在C# 实体框架5:为什么我的实体是';s集合属性为空?,c#,entity-framework,entity-framework-5,C#,Entity Framework,Entity Framework 5,我目前正在通过代码优先的方法学习实体框架(EF)。我想在一个新创建的数据库(即EF创建的数据库)上,在Professors和Classes之间建立一个简单的一对多关系模型 在我的模型中,Professor有一组Classes。一个类总是有一个Professor与其关联(即,相应的属性从不为空)。我可以创建并存储类和相关的教授,但当我访问从数据库检索的教授的类属性时,它是空的。然而,从类导航到其教授是可能的 考虑以下模型: class Class { public int Id { get
Professor
s和Class
es之间建立一个简单的一对多关系模型
在我的模型中,Professor
有一组Class
es。一个类
总是有一个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);
}
}
输出为:
3 change(s) saved.
Prof. McTest gives 0 classes.
Testing Tests (Prof. McTest)
生成的DB架构是:
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
collection属性没有出现在模式中的任何位置。这是有意的吗
有人能解释一下吗?我发现的所有示例都没有详细介绍集合属性
在我的主代码中,两个分开的using语句是故意的。如果我将它们合并在一起,Classes属性突然不是空的,但我不明白为什么
如果2合并为1,则“查询”存储在内存中的本地实体,而不是数据库
在第一个上下文中,您不需要将professor
和class
添加到上下文中。只需添加教授,类
也将被保存
检查数据库模式,确保实体正确映射到数据库
最后,将教授
课程更改为
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;}
}
班主任
{
公共教授()
{
类=新列表();
}
公共int Id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection类{get;set;}
}
我怀疑延迟加载被返回哈希集的is null逻辑所压倒。好的,经过数小时的搜索,我找到了解决方案。在查询数据库时,似乎必须明确指示EF加载实体的集合属性:
foreach (Professor p in db.Professors.Include("Classes"))
Console.WriteLine("Prof. " + p.Name + " gives " + p.Classes.Count
+ " classes.");
Include
方法就是这样做的。我应用了您建议的更改,但结果是一样的。我还用DB模式的描述更新了我的问题。请看一看,如果你发现有任何异常。我在过去可能几年前就已经给你投票了,但最近又遇到了这个问题,你在这里的问答是我第一个找到有效答案的地方。(我在MSDN中也发现了这个问题,但和最近的MSDN一样,它的形式并没有让我找到一个明显有用的语法。)有时我真不敢相信MS SQL框架设计有多奇怪。我也不敢相信这个问题只有+1票,而且不容易找到。非常感谢。
foreach (Professor p in db.Professors.Include("Classes"))
Console.WriteLine("Prof. " + p.Name + " gives " + p.Classes.Count
+ " classes.");