如果未提交更改,则实体框架返回分离的条目



对不起,如果我的问题有点愚蠢,但我真的被这个基本的东西困住了。我有具有以下方法的通用存储库:

protected List<T> GetEntities(Expression<Func<T, bool>> whereExpression)
    {
        var query = Context.Set<T>().AsQueryable();
        if (whereExpression != null)
            query = query.Where(whereExpression).AsQueryable();
        List<T> result = query.ToList();
        return result;
    }

我们的应用程序应该允许在不提交到数据库的情况下处理数据。但是在任何时候用户都应该能够保存更改。为了添加或删除条目,我使用:

 Context.Set<T>().Add(entity);

 Context.Set<T>().Remove(entity);

但是在我调用 GetEntities 后,删除的实体再次出现,新实体不会出现。显然,GetEntities 直接查询数据库,不考虑本地更改。

所以,我的问题:有没有简单的方法可以将从数据库加载的数据的where表达式与本地更改结合起来?

谢谢。

我有时会使用这个小方法来优先考虑本地数据:

public static IQueryable<TEntity> PreferLocal<TEntity>(this DbSet<TEntity> dbSet, 
    Expression<Func<TEntity, bool>> predicate)
        where TEntity : class
{
    if (dbSet.Local.AsQueryable().Any(predicate))
    {
        return dbSet.Local.AsQueryable().Where(predicate);
    }
    return dbSet.Where(predicate);
}

它首先尝试在Local集合中查找实体(因为它都在内存中,所以额外的Any并不昂贵)。如果它们不存在,则查询数据库。

在您的存储库中,您可以像这样使用:

return PreferLocal(Context.Set<T>(), whereExpression).ToList();

但也许你也应该重新考虑你的Context的生命周期。看起来你有一个长期存在的上下文,不建议这样做。

最新更新