我正在使用Entity Framework Code第一种方法和Generic Repository模式开发WPF应用程序。我的问题是在WPF应用程序运行时,当我对数据库中的数据进行更改时,WPF应用程序数据未显示修改后的最新数据。它将所有数据保留在缓存中,而不是与数据库同步。我必须关闭我的应用程序,并需要重新运行它以获取修改后的数据。我该如何解决这个问题。请帮忙
public class GenericRepository<TEntity> where TEntity : class
{
internal RcerpDbContext Context;
internal DbSet<TEntity> DbSet;
public GenericRepository(RcerpDbContext context)
{
this.Context = context;
this.DbSet = context.Set<TEntity>();
}
public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = Null,
string includeProperties = "")
{
IQueryable<TEntity> query = DbSet;
if (filter != null)
{
query = query.Where(filter);
}
query = includeProperties.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries).Aggregate(query, (current, includeProperty) => current.Include(includeProperty));
if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}
public virtual TEntity GetById(object id)
{
return DbSet.Find(id);
}
public virtual void Insert(TEntity entity)
{
DbSet.Add(entity);
}
public virtual void Delete(object id)
{
TEntity entityToDelete = DbSet.Find(id);
Delete(entityToDelete);
}
public virtual void Delete(TEntity entityToDelete)
{
if (Context.Entry(entityToDelete).State == EntityState.Detached)
{
DbSet.Attach(entityToDelete);
}
DbSet.Remove(entityToDelete);
}
public virtual void Update(TEntity entityToUpdate)
{
var entry = Context.Entry(entityToUpdate);
var primaryKey = DbSet.Create().GetType().GetProperty("Id").GetValue(entityToUpdate);
if (entry.State != EntityState.Detached) return;
var set = Context.Set<TEntity>();
var attachedEntity = set.Find(primaryKey);
if (attachedEntity != null)
{
var attachedEntry = Context.Entry(attachedEntity);
attachedEntry.CurrentValues.SetValues(entityToUpdate);
}
else
{
entry.State = EntityState.Modified;
}
}
}
答案 0 :(得分:1)
一旦你知道它被刷新(或者如果你想检查是否有任何数据已经改变),你需要创建一个新的DbContext。
您的存储库应该要求注入Func<RcerpDbContext>
,因此它可以处理当前上下文,并使用Func<>
创建一个新上下文,一旦它知道它需要从中重新加载数据集合数据库。
否则,如果您只想重新加载单个实体,可以使用:
Context.Entry<T>(entity).Reload()
此外,如果您不希望EF保留本地副本,您可以使用
Context.Set<TEntity>.AsNoTracking()
将强制EF不存储任何本地副本。请注意,如果您更改了实体,并尝试拨打SaveChange()
NOTHING 将会发生。您将手动告诉EF哪些属性已更新。
编辑1
如果你想重装一整套:
Context.Set<Car>().Local.ToList().ForEach( x=>
{
Context.Entry(x).State = EntityState.Detached;
}
虽然我强烈推荐