加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

entity-framework – 具有列表的实体框架复杂对象

发布时间:2020-12-16 09:13:32 所属栏目:asp.Net 来源:网络整理
导读:这是我关于堆栈溢出的第一个问题,所以我会尽量准确. 这是我的模特: namespace GRHMeca.Models { public class Projet { [Key] public int ID { get; set; } [Required] public String Nom { get; set; } public String Description { get; set; } public Li
这是我关于堆栈溢出的第一个问题,所以我会尽量准确.
这是我的模特:

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; }
        }
    }

而Membre是另一种常规模特.

我面临的问题如下:
如果我这样做:

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();

我正在使用实体框架6,MVC 5和代码优先迁移.
现在我有点担心性能,我想知道这个问题的原因以及如何避免它.

非常感谢

解决方法

当您调用查找实体框架时,从数据库加载实体但不加载其导航属性(引用其他实体的属性) – 如Membres集合.因为它没有加载也没有初始化为空集合,所以当你在projet.Membres上调用.ToList()时会得到NullReferenceException.

你有两个选择.将virtual关键字添加到集合中……

public virtual List<Membre> Membres { get; set; }

…这将使EF在访问时“懒洋洋地加载”该集合(这是第二个数据库查询).或者使用Include方法在单个查询中加载projet plus Membres集合:

Projet projet = db.projets.Include(p => p.Membres)
    .SingleOrDefault(p => p.ID == id);
IList<Membre> SelectionList = projet.Membres;

(使用System.Data.Entity添加;到您的代码文件中,以使用包含lambda表达式的Include方法.)

在您的情况下,我更喜欢第二个选项,因为您事先知道要加载父实体和子集合.

您可以阅读有关加载相关实体here的更多信息.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读