Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架5:为什么我的实体是';s集合属性为空?_C#_Entity Framework_Entity Framework 5 - Fatal编程技术网

C# 实体框架5:为什么我的实体是';s集合属性为空?

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

我目前正在通过代码优先的方法学习实体框架(EF)。我想在一个新创建的数据库(即EF创建的数据库)上,在
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.");