0

我正在评估 EF6 .NET 框架 4.7.2(不是核心)的 EntityFramework Plus。

在初步调查期间,我发现默认情况下缓存键基于 SQL 查询,而不是结果集中的实体类型。

我的问题是,缓存中的实体是否以某种方式共享?

例如,如果我的第一个 EF 查询是:

var employees = myContext.LookupData.Where(x=>x.Id < 100).FromCache()

我的第二个 EF 查询是在第一个 myContext 是 Dispose()d 10 分钟后执行的,它是:

var employees = myContext.LookupData.Where(x=>x.Id < 50).FromCache()

我们可以看到第二个查询的结果集将包含第一个查询的记录。

Entity Framework Plus 是否会检查实体 EF 即将在内存中具体化是否已经存在于第一个查询的缓存中,或者是否存在于某些共享实体缓存中?

如果没有,使用 EF Plus 缓存永不更改或不经常更改的实体以在查询之间共享的最佳实践是什么?

我目前有一个解决方案,即使用标签为用作查找数据的每种实体类型创建派生自 Type.FullName 的命名缓存,但有更好的方法吗?

提前致谢。

4

1 回答 1

1

使用的缓存是MemoryCachehttps ://github.com/zzzprojects/EntityFramework-Plus/blob/master/src/shared/Z.EF.Plus.QueryCache.Shared/QueryCacheManager.cs#L41

Entity Framework Plus 是否会检查实体 EF 是否即将在内存中实现,是否已存在于缓存中

两个查询中的实体将不同。即使它们具有相同的 id,引用也不会相同。其背后的原因是,在第一个查询中,您可能包含了相关部门,但在第二个查询中没有。所以我们根本不检查实体是否已经在缓存中。

缓存永不更改或不经常更改的最佳做法是什么

这取决于,如果你只有 2000 名员工,可能一次加载所有内容并重新使用缓存将是一个非常好的解决方案。在应用程序端过滤一个小列表不会影响性能:

var employees = myContext.LookupData.FromCache().Where(x=>x.Id < 100);
于 2020-02-27T14:39:47.193 回答