实体框架5:为什么我的实体的集合属性为空?

Goo*_*ide 4 c# entity-framework entity-framework-5

我目前正在通过Code First方法学习实体框架(EF).我想在新创建的数据库(即由EF创建)上建模Professors和Classes 之间的简单一对多关系.

在我的模型中,a Professor有一个Classes 的集合.A Class总是有一个Professor与之关联的(即相应的属性永远不为null).我可以创建和存储一个Class和一个关联的Professor,但是当我访问从数据库中检索到的Classes属性时Professor,它是空的.但是,从a导航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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的主要方法中,我创建并访问我的数据,如下所示:

    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 + ")");
    }
Run Code Online (Sandbox Code Playgroud)

输出是:

3 change(s) saved.
Prof. McTest gives 0 classes.
Testing Tests (Prof. McTest)
Run Code Online (Sandbox Code Playgroud)

生成的数据库架构是:

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)
Run Code Online (Sandbox Code Playgroud)

如您所见,Classes集合属性不会出现在架构中的任何位置.这是有意的吗?

有人可以对此有所了解吗?我发现的所有示例都不会详细介绍集合属性.

Goo*_*ide 7

好的,经过几个小时的搜索,我找到了解决方案.在查询数据库时,似乎必须明确指示EF加载实体的集合属性:

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

Include方法做到这一点.

  • 我可能在几年前就已经对你投了赞成票,但最近又遇到了这个问题,你在这里的问答是我找到工作答案的第一个地方。(我也在 MSDN 中发现了这个问题,但和最近的 MSDN 一样,并不是真正以一种让我获得明显有用的语法的形式。)有时我无法相信 MS SQL 框架设计有多么奇怪。我也不敢相信这个问题只有 +1 票,而且不容易找到。谢谢! (2认同)