Ala*_*aMS 3 entity-framework object code-first complextype asp.net-mvc-5
这是我关于堆栈溢出的第一个问题,所以我会尽量准确.这是我的模特:
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; }
}
}
Run Code Online (Sandbox Code Playgroud)
而Membre是另一种常规模特.
我面临的问题如下:如果我这样做:
Projet projet = db.projets.Find(id);
IList<Membre> SelectionList = projet.Membres.ToList();
Run Code Online (Sandbox Code Playgroud)
我得到一个空指针异常; 但这很好用:
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();
Run Code Online (Sandbox Code Playgroud)
我正在使用实体框架6,MVC 5和代码优先迁移.现在我有点担心性能,我想知道这个问题的原因以及如何避免它.
非常感谢
Sla*_*uma 11
当您调用FindEntity Framework时,从数据库加载实体但不加载其导航属性(引用其他实体的属性) - 就像Membres集合一样.因为这不加载,也不初始化为空收集你得到一个NullReferenceException当你打电话.ToList()的projet.Membres.
你有两个选择.将virtual关键字添加到集合中......
public virtual List<Membre> Membres { get; set; }
Run Code Online (Sandbox Code Playgroud)
...这将使EF在访问时"懒洋洋地加载"该集合(这是第二个数据库查询).或者使用该Include方法在单个查询中加载projet加Membres集合:
Projet projet = db.projets.Include(p => p.Membres)
.SingleOrDefault(p => p.ID == id);
IList<Membre> SelectionList = projet.Membres;
Run Code Online (Sandbox Code Playgroud)
(添加using System.Data.Entity;到您的代码文件以使Includelambda表达式的方法可用.)
在您的情况下,我更喜欢第二个选项,因为您事先知道要加载父实体和子集合.
您可以在此处详细了解如何加载相关实体.
| 归档时间: |
|
| 查看次数: |
4669 次 |
| 最近记录: |