为什么实体框架返回空List <>而不是空?

igo*_*ujo 29 c# entity-framework nullreferenceexception ef-code-first entity-framework-4.1

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

我有一节有一对多的关系.

class MyClass{
    public List<OtherClass> otherClasses {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

当我持久化这个类的一个实例时,我用空List <>填充它的关系

MyClass myClass = new MyClass(){ otherClasses = new List<OtherClass>() }
context.myClass.Add(myClass);
Run Code Online (Sandbox Code Playgroud)

问题是,当我尝试检索该实例时,出于任何原因,我尝试访问该列表,系统给我一个空参考例外...

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

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

Eri*_*sch 28

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

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

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

    public MyClass() {
        _otherClasses = new List<OtherClass>();
    }
} 
Run Code Online (Sandbox Code Playgroud)


Era*_*nga 16

使otherClasses集合虚拟化.这将使EF能够延迟加载集合.

class MyClass{
    public virtual List<OtherClass> otherClasses {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

否则使用Include方法的急切加载.

context.myClass.Include(m => m.otherClasses).SingleOrDefault(m => m.Id == foo);
Run Code Online (Sandbox Code Playgroud)

  • 确实,延迟加载解决了我的问题......但我正在尝试避免延迟加载,因为当我使用JSON请求时它给了我循环引用序列化错误.无论如何,我很高兴你的帮助.谢谢! (2认同)