entity-framework - 带有列表的 Entity Framework 复杂对象

标签 entity-framework object code-first asp.net-mvc-5 complextype

这是我关于堆栈溢出的第一个问题,所以我会尽量准确。
这是我的模型:

    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加载方法 projetMembres单个查询中的集合:
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/

相关文章:

entity-framework - Entity Framework 代码优先 Azure 连接

c# - "the term ' 添加迁移 ' is not recognized as the name of a cmdlet" Visual Studio 2019

c# - 导航属性已配置有冲突的多重性 Fluent API

javascript - 在javascript中循环访问 "function"对象

Java,在其他地方使用数组中的字符串?

c# - 如何在对象列表中查找单个项目?

inheritance - 让 Entity Framework 忽略派生类型

c# - LINQ to Entities 无法识别方法 'System.Collections.Generic.Dictionary`

entity-framework - 我应该将 TransactionScope 与 DbContext 一起使用吗

c# - 模拟 DbSet 不返回对象