2016-08-22 43 views
2

如何告诉DBContext的Find方法它应该急切地加载导航属性/实体?如何使用DBContext指定急切加载查找方法

我有下面的代码删除联想到相关的辅助实体:

Person primary = db.People.Find(Id); 
if (primary == null) 
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 

// This line is required to load the related entity 
db.Entry(primary).Reference("Secondary").Load(); 

primary.Secondary = null; 
db.SaveChanges(); 

我不得不添加行db.Entry(primary).Reference("Secondary").Load();得到它的工作。我明白这是因为实体框架使用延迟加载。我可以在Find方法中覆盖它,并通过使用Eager版本的Find方法摆脱多余的行吗?

回答

-1

只是改变

Person primary = db.People.Find(Id); 

Person primary = db.People.Find(Id).FirstOrDefault(); 
0

或者你可以使用

var result = db.Person.Include(c=>c.Secondary).FirstOrDefault(entity=>entity.Id == Id); 

使用using System.Data.Entity;在包括LINQ的能力,否则你可以只使用字符串“次要“像这样:.Include("Secondary")

6

预先加载由Include方法完成:

db.People.Include(p => p.Secondary) 

哪些可以跟随FirstOrDefault(p => p.Id == id),例如。

Find是一种DbSet方法,首先尝试在上下文的缓存中查找请求的实体。只有当它没有被找到时,实体才从数据库中获取。

由于此特殊行为(的Find),IncludeFind不能混合。当在缓存中找到根实体时,很难定义该做什么,但要包含的实体不是(或仅部分)。它们是否应该从数据库中提取?这意味着Find + Include总是必须查询包含的实体的数据库,因为它不能依靠本地缓存完成。这将会破坏Find的目的。或者,如果根实体位于本地缓存中,应该只找到本地缓存中的实体?这会使方法的结果不明确。

在ASP.Net MVC(或Web API)操作方法中,Find几乎不会有用,因为大多数情况下,都会创建一个新的上下文,并且实体将从数据库中提取一次。换句话说,缓存中没有任何内容可以被返回。您可能需要使用该方法以获得简洁,但关于数据库往返的效果与FirstOrDefault()相同。