如何使用DBContext Find方法指定预先加载
如何告诉DBContext的Find方法它应该急切地加载导航属性/实体?
我有以下代码删除与相关辅助实体的关联:
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();
让它工作。 我理解这是因为entity framework正在使用延迟加载。 我可以在Find方法中覆盖它,并通过使用Eager版本的Find方法摆脱额外的行吗?
通过Include
方法完成加载:
db.People.Include(p => p.Secondary)
例如,可以跟随FirstOrDefault(p => p.Id == id)
。
Find
是一个DbSet
方法,它首先尝试在上下文的缓存中查找请求的实体。 只有在那里找不到它时,才从数据库中获取实体。
由于这种特殊行为( Find
), Include
和Find
不能混合使用。 当在缓存中找到根实体时,很难定义要执行的操作,但要包含的实体不是(或仅部分)。 它们应该从数据库中提取吗? 这意味着Find
+ Include
总是必须在数据库中查询包含的实体,因为它不能依赖本地缓存来完成。 那会破坏Find
的目的。 或者,如果根实体位于本地缓存中,则应该只找到本地缓存中的实体? 这会使方法的结果模糊不清。
在ASP.Net MVC(或Web API)操作方法中, Find
几乎没有用处,因为大多数时候,将创建一个新的上下文,并且将从数据库中提取一次实体。 换句话说,缓存中没有任何内容可以返回。 您可能希望将该方法用于其简洁性,但是关于数据库往返的效果与FirstOrDefault()
相同。
或者你可以使用
var result = db.Person.Include(c=>c.Secondary).FirstOrDefault(entity=>entity.Id == Id);
使用using System.Data.Entity;
对于Include中的Linqfunction,否则你可以像这样使用字符串“Secondary”:. .Include("Secondary")
只需使用Include方法:
var result = db.Person.Include(c => c.Secondary).FirstOrDefault(entity => entity.Id == Id);
参考:
https://www.entityframeworktutorial.net/EntityFramework4.3/eager-loading-with-dbcontext.aspx
只是改变
Person primary = db.People.Find(Id);
至
上述就是C#学习教程:如何使用DBContext Find方法指定预先加载分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
Person primary = db.People.Find(Id).FirstOrDefault();
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/991633.html