为什么Entity Framework返回null List<>而不是空的?

时间:2012-02-12 05:41:20

标签: c# entity-framework entity-framework-4.1 ef-code-first nullreferenceexception

我是ASP .NET MVC世界的新手。也许,这就是我无法向自己解释对我来说是一个令人讨厌的问题的原因。

我有一个有一对多关系的课程。

class MyClass{
    public List<OtherClass> otherClasses {get;set;}
}

当我持续这个类的一个实例时,我用空列表填充它的关系&lt;&gt;

MyClass myClass = new MyClass(){ otherClasses = new List<OtherClass>() }
context.myClass.Add(myClass);

问题在于,当我尝试检索该实例时,出于任何原因,我尝试访问该列表,系统给我一个空引用异常...

我的问题是:为什么EF不返回空列表而不是空列表?特别是在这种情况下,我坚持使用空列表?

有什么方法可以避免验证实例是否为空?

3 个答案:

答案 0 :(得分:27)

您应该让您的实体在构造函数中创建这些列表。 EF不会创建依赖集合,并期望实体这样做。

所以,你的情况,你会让你的实体像这样:

class MyClass{ 
    public List<OtherClass> _otherClasses {get;set;} 

    public MyClass() {
        _otherClasses = new List<OtherClass>();
    }
} 

答案 1 :(得分:16)

otherClasses集合设为虚拟。这将使EF能够延迟加载集合。

class MyClass{
    public virtual List<OtherClass> otherClasses {get;set;}
}

否则使用Include方法加急切加载。

context.myClass.Include(m => m.otherClasses).SingleOrDefault(m => m.Id == foo);

答案 2 :(得分:0)

因此,如果我理解正确,您将向上下文添加一个空的List<OtherClass>,然后尝试检索它。

我猜你必须考虑上下文如何跟踪和查询其上下文中的实体。这通常由实体的Key完成。在您的示例中,您尚未向实体提供Key,因此,上下文在实体上没有句柄

因此,在查询时,上下文找不到对象并返回null。

如果你想初始化一个新实体,我建议给它至少一个Key(通常是Id属性),然后在你稍后查找时用那个键选择。

希望这有帮助。