您的位置:首页 > 其它

EF 二级缓存 EFSecondLevelCache

2016-12-29 13:30 1171 查看
EFSecondLevelCache
=======
Entity Framework 6.x Second Level Caching Library.

二级缓存是一个查询缓存。EF命令的结果将存储在缓存中,这相同的EF命令将从缓存中检索数据,而不是执行它们对数据库了。

使用方法:
1- 设置缓存失效通过重写SaveChanges方法防止过期写道

namespace EFSecondLevelCache.TestDataLayer.DataLayer
{
public class SampleContext : DbContext
{
// public DbSet<Product> Products { get; set; }

public SampleContext()
: base("connectionString1")
{
}

      //重写 SaveChanges
public override int SaveChanges()
{
return SaveAllChanges(invalidateCacheDependencies: true);
}

public int SaveAllChanges(bool invalidateCacheDependencies = true)
{
var changedEntityNames = getChangedEntityNames();
var result = base.SaveChanges();
if (invalidateCacheDependencies)
{
new EFCacheServiceProvider().InvalidateCacheDependencies(changedEntityNames);
}
return result;
}

//修改、删除、添加数据时缓存失效
private string[] getChangedEntityNames()
{
return this.ChangeTracker.Entries()
.Where(x => x.State == EntityState.Added ||
x.State == EntityState.Modified ||
x.State == EntityState.Deleted)
.Select(x => System.Data.Entity.Core.Objects.ObjectContext.GetObjectType(x.Entity.GetType()).FullName)
.Distinct()
.ToArray();
}
}
}

有时你不想缓存失效时非更新NumberOfViews等重要性质。
在这些情况下,试着SaveAllChanges(invalidateCacheDependencies:false),之前更新数据。

2- 然后正常查询缓存的结果:
var products = context.Products.Include(x => x.Tags).FirstOrDefault();

我们可以使用新的“缓存()的扩展方法:
var products = context.Products.Include(x => x.Tags).Cacheable().FirstOrDefault(); // Async methods are supported too.
注意:
适合使用全球网站的查询缓存设置,公共的文章或评论列表
而不是经常改变,私人或特定的数据,每个用户。
如果一个页面需要身份验证,其数据不应该被缓存。

开源地址: https://github.com/VahidN/EFSecondLevelCache[/code] 
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: