在我的数据库中,我有很多查找,它将有一个用于更改的UI,我有MVC网站,并且希望将这些查找加载一次,并在发生任何更改时刷新
我的数据访问层如下:
private ClassessEntities Context;
protected Repository()
{
Context = new ArabicEWorldEntities();
}
public IEnumerable<T> Get(Expression<Func<T, bool>> predicate)
{
return Context.CreateObjectSet<T>().Where(predicate).ToList();
}
public T First(Expression<Func<T, bool>> predicate)
{
return Context.CreateObjectSet<T>().Where(predicate).FirstOrDefault();
}
public IEnumerable<T> GetAll()
{
return Context.CreateObjectSet<T>().ToList();
}
public IEnumerable<T> GetAllOrderBy(Func<T, object> keySelector)
{
return Context.CreateObjectSet<T>().OrderBy(keySelector).ToList();
}
public IEnumerable<T> GetAllOrderByDescending(Func<T, object> keySelector)
{
return Context.CreateObjectSet<T>().OrderByDescending(keySelector).ToList();
}
public void Commit()
{
Context.SaveChanges();
}
public void Add(T entity)
{
Context.CreateObjectSet<T>().AddObject(entity);
}
public void Update(T entity)
{
Context.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified);
Context.SaveChanges();
}
public void Delete(T entity)
{
Context.DeleteObject(entity);
Context.SaveChanges();
}
public void Dispose()
{
if (Context != null)
{
Context.Dispose();
}
GC.SuppressFinalize(this);
}
并从查找中获取列表我使用
之类的方法private static ClassesEntities Context;
public static IEnumerable<T> GetLookup<T>() where T : System.Data.Objects.DataClasses.EntityObject
{
try
{
var key = typeof(T).Name;
// 1. we need the container for the conceptual model
var container = Context.MetadataWorkspace.GetEntityContainer(
Context.DefaultContainerName, System.Data.Metadata.Edm.DataSpace.CSpace);
// 2. we need the name given to the element set in that conceptual model
var name = container.BaseEntitySets.Where((s) => s.ElementType.Name.Equals(key)).FirstOrDefault().Name;
// 3. finally, we can create a basic query for this set
var query = Context.CreateQuery<T>("[" + name + "]");
return query.ToList();
}
catch (System.Data.EntityException ex)
{
throw new ArgumentException("Invalid Entity Type supplied for Lookup", ex);
}
}
任何想法处理我上面讨论的情况加载一次,如果有任何更改重新加载它我使用Web服务将这些方法调用到我的MVC
答案 0 :(得分:1)
我会有一个CachedLookup类,它包含每个类型(甚至是Dictionary<Type,IEnumerable<T>>
)的IEnumerable字段,其中包含缓存的结果,然后GetLookup将是该类的非静态方法。如果没有发生任何变化,它将返回该字段。
您希望缓存无效的方式取决于您。如果你想在一个合理的时间(即不是立即)更新查找,你可以有一个最后更新的时间,然后只检查当前时间(在GetLookup调用上),如果它是在最后一个日期后30分钟并刷新缓存。如果您希望它立即生效,并且您的应用程序中有一些操作使缓存失效,您可以使用InvalidateCache<T>()
方法刷新该特定缓存。
CachedLookup将知道如何刷新缓存,并且只是一个获取查找的代理