【问题标题】:Using DbSet<TEntity>.Local Property in Entity Framework在实体框架中使用 DbSet<TEntity>.Local 属性
【发布时间】:2015-04-18 11:46:46
【问题描述】:

MSDN documentation 之后,我们可以使用 Local 属性直接从上下文中获取本地/缓存数据,而无需对数据源进行额外请求:

获取表示此集中所有已添加、未更改和已修改实体的本地视图的 ObservableCollection。
(...)
该属性可用于数据绑定,方法是使用数据填充集合,例如使用 Load 扩展方法,然后通过该属性绑定到本地数据。

问题是,该代码不起作用(本地为空):

context.SampleEntities.Select(x => new { x.A, x.B }).Load();
// context.SampleEntities.Local.Count is 0

但在这种情况下,它似乎工作正常:

context.SampleEntities.Load();
// context.SampleEntities.Local.Count is not 0

也许有人可以解释使用 Local 属性的正确方法是什么?
更重要的是,如何将它与部分加载的实体一起使用,就像上面的例子一样?

【问题讨论】:

  • EF 无处存储这些投影查询:您没有一个只包含这些字段的集合。由于这个原因,我认为根本不可能在本地缓存它们。
  • 但我认为它应该仍然是实体未完全加载(例如某些字段为空)的同一个集合(SampleEntities)。我的逻辑是,SQL 查询的结果也应该存储在 DbSet 中(其中真正重要的是实体键和实体状态),或者以另一种方式,部分加载的实体根本不会被缓存。那么,您是否指出第二种情况是正确的?

标签: c# entity-framework caching local dbset


【解决方案1】:

这是预期的行为。本地缓存在 DbContext 对象的生命周期内由您从数据库加载的实体。带查询:

context.SampleEntities.Select(x => new { x.A, x.B })

您没有将 SampleEntity 对象加载到应用程序内存中,而只有其属性 A 和 B。Select 也被转换为 sql 查询,以限制从查询返回的行,从而提高性能。

【讨论】:

猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
相关资源
最近更新 更多