如果未提交更改,EntityFramework将返回分离的条目

时间:2016-06-03 11:47:55

标签: c# .net entity-framework

对不起,如果我的问题有点愚蠢,但我真的陷入了这个基本的问题。 我有通用的存储库,其方法如下:

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-expression与从数据库加载的数据和本地更改结合起来?

感谢。

1 个答案:

答案 0 :(得分:1)

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

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的生命周期。看起来你有一个长期的背景,不推荐这样做。