24

我很新的ASP .NET MVC世界。也许,这就是我无法向自己解释造成恼人问题的原因。为什么实体框架返回null List <>而不是空的?

我有一个类与一对多的关系。

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

当我坚持这个类的一个实例,我填补它与空List <>

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

的问题是,当我试图检索该实例,以及任何原因,我尝试访问该列表,系统给了我一个空引用例外...

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

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

+0

什么是你的实体框架类? – 2012-02-12 05:57:02

回答

21

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

所以,你的情况,你会做你的实体是这样的:

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

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

这绝对能解决我的问题!谢谢你的帮助!所以EF在加载持久化信息之前调用对象构造函数,不是吗? – 2012-02-12 15:47:36

+0

不,EF不会“调用”构造函数。 C#的确如此。每当创建一个对象时,构造函数都会被调用。即使EF实现了数据库中的对象。 – 2012-02-12 17:58:05

+0

知道了!谢谢! – 2012-02-12 22:28:23

16

使otherClasses集合变为虚拟。这将使EF延迟加载集合。

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

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

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

事实上,延迟加载解决了我的问题......但我试图避免延迟加载,因为当我使用JSON请求时它给了我循环引用序列化错误。无论如何,我很乐意为您提供帮助。谢谢! – 2012-02-12 15:40:48

+0

对于循环引用问题,可以使用像'JsonIgnore'这样的属性来防止反向链接导航属性被序列化。 – Jess 2016-04-04 19:14:31

0

所以,如果我理解正确的话,你要添加一个空List<OtherClass>上下文,然后试图找回它。

我想你必须考虑上下文将如何跟踪和查询上下文中的实体。这通常由实体的Key完成。在你的例子中,你没有给出实体一个Key,因此,该实体的上下文没有句柄

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

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

希望这会有所帮助。

+0

事实上,我真正的类有所有ID属性。这只是一个例子,我忘记了包含ID:P。无论如何,谢谢你的回答! – 2012-02-12 15:49:58

相关问题