我正在使用带有通用存储库的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;
}