这是我关于堆栈溢出的第一个问题,所以我会尽量准确。
这是我的模型:
namespace GRHMeca.Models
{
public class Projet
{
[Key]
public int ID { get; set; }
[Required]
public String Nom { get; set; }
public String Description { get; set; }
public List<Membre> Membres { get; set; }
}
}
和成员是另一个常规模型。
我面临的问题如下:
如果我这样做:
Projet projet = db.projets.Find(id);
IList<Membre> SelectionList = projet.Membres.ToList();
我得到一个空指针异常;
但这工作正常:
IEnumerable<Membre> SelectionList = new List<Membre>();
SelectionList = db.Membres
.ToList()
.AsEnumerable<Membre>()
.Except<Membre>(
db.Membres
.ToList()
.AsEnumerable<Membre>()
.Except<Membre>(
projet.Membres
.ToList()
.AsEnumerable<Membre>()
)
)
.ToList();
我正在使用 Entity Framework 6、MVC 5 和代码优先迁移。
现在我有点担心性能,我想知道这个问题的原因以及如何避免它。
非常感谢
最佳答案
当您调用 Find
Entity Framework 从数据库加载一个实体,但不加载它的导航属性(引用其他实体的属性)——比如 Membres
收藏。因为它既没有加载也没有初始化为一个空集合,你会得到一个 NullReferenceException
当您调用 .ToList()
在 projet.Membres
.
你在这里有两个选择。添加 virtual
集合的关键字...
public virtual List<Membre> Membres { get; set; }
...这将使 EF 在您访问集合时“延迟加载”它(这是第二个数据库查询)。或使用
Include
加载方法 projet
加Membres
单个查询中的集合:Projet projet = db.projets.Include(p => p.Membres)
.SingleOrDefault(p => p.ID == id);
IList<Membre> SelectionList = projet.Membres;
(将
using System.Data.Entity;
添加到您的代码文件中,以使用带有 lambda 表达式的 Include
方法。)在您的情况下,我更喜欢第二个选项,因为您事先知道要加载父实体和子集合。
您可以阅读有关加载相关实体的更多信息 here .
关于entity-framework - 带有列表的 Entity Framework 复杂对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22049750/