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

本文关键字:gt lt 框架 实体 返回 null List 为什么 | 更新日期: 2023-09-27 18:24:27

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

我有一个一对多关系班。

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

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

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

问题是,当我试图检索该实例时,由于任何原因,我试图访问该列表,系统会给我一个空引用异常。。。

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

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

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

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

所以,在你的情况下,你会把你的实体做成这样:

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

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

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

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

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

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

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

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

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

希望这能有所帮助。