gpt4 book ai didi

entity-framework - 从二级缓存中排除某些实体

转载 作者:行者123 更新时间:2023-12-02 04:15:43 25 4
gpt4 key购买 nike

我正在使用EFCache在我的 EF 上下文中提供二级缓存。

我遇到了一个问题,我的一个实体连接到提供行级安全性的 View 。所以这个 View 根据一些参数过滤行。当使用二级缓存时,所有用户都会得到相同的结果!

我正在寻找一种从缓存中排除某些实体的方法,欢迎任何帮助。

这是我的缓存配置:

class CacheConfiguration : DbConfiguration
{
public CacheConfiguration()
{
var transactionHandler = new CacheTransactionHandler(new InMemoryCache());

AddInterceptor(transactionHandler);

var cachingpolicy = new cachingpolicy();

Loaded +=
(sender, e) => e.ReplaceService<DbProviderServices>(
(s, _) => new CachingProviderServices(s, transactionHandler, cachingPolicy));
}
}

最佳答案

我在 this blog post 中找到了答案.

为了排除某些实体,您需要创建缓存策略并从 CachingPolicy 驱动一个类。

重写 CanBeCached 方法后,您可以返回 false 以防止缓存。

这是我的工作代码:

class CacheConfiguration : DbConfiguration
{
public CacheConfiguration()
{
var transactionHandler = new CacheTransactionHandler(new InMemoryCache());

AddInterceptor(transactionHandler);

//var cachingPolicy = new CachingPolicy();
var cachingPolicy = new myCachingPolicy();

Loaded +=
(sender, e) => e.ReplaceService<DbProviderServices>(
(s, _) => new CachingProviderServices(s, transactionHandler, cachingPolicy));
}
}

public class myCachingPolicy : CachingPolicy
{
protected override bool CanBeCached(System.Collections.ObjectModel.ReadOnlyCollection<System.Data.Entity.Core.Metadata.Edm.EntitySetBase> affectedEntitySets, string sql, IEnumerable<KeyValuePair<string, object>> parameters)
{
string[] excludedEntities = {
"permView1",
"permView2",
"permView3"};

if (affectedEntitySets.Where(x => excludedEntities.Contains(x.Table)).Any())
{
return false;
}
else
{
return base.CanBeCached(affectedEntitySets, sql, parameters);
}
}
}

关于entity-framework - 从二级缓存中排除某些实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33885939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com