使用不同的DbContexts进行缓存

时间:2016-06-16 21:25:21

标签: c# entity-framework caching

我正在使用带有通用存储库的UnitOfWork模式。每当查询数据库时,我都实现了内存缓存。加载记录完全没问题。我遇到的问题是,如果我要创建一个新的记录来实例化一个新的UnitOfWOrk,它与案例中使用的任何属性都不同。

例如 MemoryCache有一个种族列表

伪代码

我创建一个新Person并设置Person.Ethnicity = MemoryCache.Ethnicities.First(x => x.type == type);

当我尝试保存时,它会向我提供此错误An entity object cannot be referenced by multiple instances of IEntityChangeTracker。如果我没有实例化新的UnitOfWork,我可以摆脱它。

所以现在我有点陷入困境,我是否使用单身Dbcontext?它可能会变得非常沉重和缓慢加班,或者我只是完全摆脱缓存。我的系统目前所做的是它们在需要任何时候查询数据库。我正在尝试减少对数据库的查询次数,因为客户端的互联网连接很糟糕。

public override IEnumerable<T> Get(Expression<Func<T, bool>> filter = null,
    Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
    int? numberOfEntities = null,
    IEnumerable<string> includeProperties = null)
{
    IQueryable<T> query = DbSet;
    List<T> result = new List<T>();

    if (filter != null)
    {
        query = query.Where(filter);
    }

    if (includeProperties != null)
    {
        query = includeProperties.Aggregate(query,
            (current, includeProperty) => current.Include(includeProperty));
    }

    if (orderBy != null)
    {
        query = orderBy(query);
    }

    var actualNumberOfEntities = Int32.MaxValue;

    if (numberOfEntities.HasValue)
    {
        actualNumberOfEntities = Math.Max(1, numberOfEntities.Value);
    }

    if (MemoryCache.Default[query.ToString()] == null)
    {        
        result = query.AsExpandable().Take(actualNumberOfEntities).ToList();
        MemoryCache.Default[query.ToString()] = result;
        return result;
    }
    else
    {
        result = (MemoryCache.Default[query.ToString()] as IEnumerable<T>).ToList();
    }

    return result;

}

0 个答案:

没有答案