entityframework搜索值仅用于搜索不更新

时间:2014-02-26 09:44:47

标签: entity-framework

我像Codefirst演示一样构建了一个Repository。

public virtual IQueryable<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);
        }

        foreach (var includeProperty in includeProperties.Split
            (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
        {
            query = query.Include(includeProperty);
        }

        if (orderBy != null)
        {
            return orderBy(query);
        }
        else
        {
            return query;
        }
    }

但这次搜索有问题。

有时其他人使用'get'函数来搜索值,这个值将被用作其他函数中的param。

就像这样:

UserInfoBll userInfoBll = new UserInfoBll();
        UserInfo userInfo = userInfoBll.Get(p => p.UserCode == "8001", null, "CorpShop").First();
        ConsumeProcess.process(userInfo);

当我处理savechange时,如果userInfo值在ConsumeProcess.process函数中发生变化。

它会更新我不想更新的内容,所以我想找到一种方法。搜索值仅用于搜索,当值更改时,不会更新值。

通过这种方式我写了这个:

public virtual List<TEntity> GetList(Expression<Func<TEntity, bool>> filter = null,
        Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
        string includeProperties = "")
    {
        List<TEntity> tEntityList = Get(filter, orderBy, includeProperties).ToList();
        SetEntityStates(EntityState.Detached, tEntityList);
        return tEntityList;
    }

protected void SetEntityStates(EntityState entityState, IEnumerable<TEntity> tEntity_params)
    {
        foreach (TEntity tEntity in tEntity_params)
        {
            if (tEntity != null)
            {
                context.Entry(tEntity).State = entityState;
            }
        }
    }

如果有人更改了搜索值,现在它不会更新。但还有另一个问题。 如果我使用这样的代码,则包含的属性无法获取

UserInfoBll userInfoBll = new UserInfoBll();
        userInfo = userInfoBll.GetList(p => p.UserCode == "8001", null, "CorpShop").First(); // CorpShop is include property
        corpShop = userInfo.CorpShop; //userInfo.CorpShop is null

1 个答案:

答案 0 :(得分:0)

如果您有IQueryable,则让实体与db断开连接的最简单方法是使用AsNoTracking方法。

public virtual List<TEntity> GetList(Expression<Func<TEntity, bool>> filter = null,
        Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
        string includeProperties = "")
{
    return = Get(filter, orderBy, includeProperties).AsNoTracking().ToList();
}