【问题标题】:Why does Entity Framework return null List<> instead of empty ones?为什么实体框架返回 null List<> 而不是空的?
【发布时间】:2012-03-04 00:58:46
【问题描述】:

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

我有一堂课是一对多的relashionship。

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

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

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

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

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

如果实例为空,有什么方法可以避免验证?

【问题讨论】:

  • 你是什么实体框架类?

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 这绝对解决了我的问题!谢谢你的帮助!所以 EF 在使用持久化信息加载对象之前调用对象构造函数,不是吗?
  • 不,EF 不会“调用”构造函数。 C# 可以。每当创建对象时,都会调用构造函数。即使 EF 从数据库中具体化对象。
  • @MystereMan 你是完全正确的,但是,关键是有时这个构造函数调用被绕过了!例如,在 WCF 二进制反序列化中
  • @Alireza - 如果没有在 WCF 中调用构造函数,那是因为 WCF 可能不是新对象,而是使用另一种机制来实现它。序列化是一个复杂的过程,他们经常在低级别做一些事情来完成它。
  • @ErikFunkenbusch 我找不到任何 EF 相关文档告诉“EF 期望实体创建依赖集合”。
【解决方案2】:

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

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

否则使用带有Include 方法的预加载。

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

【讨论】:

  • 确实,延迟加载解决了我的问题......但我试图避免延迟加载,因为当我使用 JSON 请求时它给了我循环引用序列化错误。无论如何,我很高兴得到你的帮助。谢谢!
  • 对于循环引用问题,可以使用JsonIgnore等属性来防止反向链接导航属性被序列化。
【解决方案3】:

所以,如果我理解正确,您将在上下文中添加一个空的 List&lt;OtherClass&gt;,然后尝试检索它。

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

因此,当你查询时,上下文没有找到对象并返回null。

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

希望这会有所帮助。

【讨论】:

  • 其实我的真实类都有一个ID属性。这只是我忘记包含 ID 的示例:P。无论如何,谢谢你的回答!
猜你喜欢
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多