Entity Framework 另外 - 是否可以在不同查询之间共享实体?

Entity Framework Plus - is it possible to share entities between different queries?

我正在评估 EntityFramework Plus for EF6 .NET Framework 4.7.2(非 Core)。

在初步调查中,我发现默认情况下缓存键基于 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 是否还要检查实体 EF 将在内存中具体化是否已经存在于第一个查询的缓存中,或者是否存在于某些共享实体缓存中?

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

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

提前致谢。

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

Would Entity Framework Plus check to see if the entities EF is about to materialize in memory already exist in the cache

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

What is best practice to cache never-changing, or infrequently changed

视情况而定,如果您只有 2000 名员工,那么一次加载所有内容并重新使用缓存可能是一个很好的解决方案。在应用程序端过滤一个小列表不会影响性能:

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