Csharp/C#教程:如何使用DBContext Find方法指定预先加载分享


如何使用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 ), IncludeFind不能混合使用。 当在缓存中找到根实体时,很难定义要执行的操作,但要包含的实体不是(或仅部分)。 它们应该从数据库中提取吗? 这意味着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

(0)
上一篇 2021年12月24日
下一篇 2021年12月24日

精彩推荐