EF代码第一种方法中的数据刷新问题

时间:2015-03-14 13:32:27

标签: c# wpf entity-framework

我正在使用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;
        }
    }

}

1 个答案:

答案 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;
}

虽然我强烈推荐

  1. 使用新的上下文并处理当前的上下文。
  2. 使用AsNoTracking()修饰符进行查询。