c# - Entity Framework ,在单个查询中通过主键加载多个实体,同时仍然使用缓存

标签 c# .net entity-framework entity-framework-6

我有一个表的主键 ID 列表,我想将其实体拉入 EF 内存,修改,然后保存。

用一个 id 你会做类似的事情

var entity = dbContext.Entity.Find(id);

entity.SomeColumn = "something";

dbContext.SaveChanges()

目前我正在做这样的事情,以在一个 RTT 中提取所有要修改的实体。

int[] ids = new int[] { 1, 2, 3, 4 };

Entity[] entities = dbContext.Entity
  .Where(c => ids.Contains(c.PrimaryKey))
  .ToArray();

问题是,EF 是否足够聪明,知道在与我的数据库发生冲突之前检查缓存?例如,如果实体 1-4 已经附加到上下文,则不应进行数据库查询。

最佳答案

不是隐含的。

Where() 将始终查询数据库。要显式查询缓存,您需要使用 .Local:

dbContext.Entity.Local.Where(...

这不会访问数据库,但只会返回之前缓存/加载的实体。

很高兴知道:要查看查询,请定义一个 Log 函数,如下所示:

dbContext.Database.Log = Console.WriteLine;

关于c# - Entity Framework ,在单个查询中通过主键加载多个实体,同时仍然使用缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36636133/

相关文章:

c# - XDocument - 表达式帮助

c# - 如何向 XmlArray 元素添加属性(XML 序列化)?

c# - FirstOrDefault 抛出异常而不是 null

c# - 从 Entity Framework 中的实体获取 DbContext

c# - Linq 从自定义嵌套对象列表中选择项目列表

c# - 从 Matlab 到 C# 的多元正态随机数

c# - 如何创建一个可以执行传递给它的任何其他方法的方法

.net - SQL Server 是否缓存 LINQ to SQL 查询?

c# - 使用 C# 通过 Gmail SMTP 服务器发送电子邮件

c# - 为什么我不能通过 Entity Framework 覆盖某个字段?