2014-02-26 137 views
0

我構建一個存儲庫就像Codefirst演示。entityframework搜索值只搜索不更新

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'函數來搜索值,這個值將被用作其他函數中的參數。

就像這樣:

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

如果在功能ConsumeProcess.process USERINFO值的變化,當我處理savechange。

它會更新我不想更新的東西,所以我想找到一種方法。搜索值僅用於搜索,當值更改時,不更新值。

對於這樣我寫了這個:

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 
+0

你正在更新你不想更新的值嗎?我想找到問題的根源,而不是像你在'GetList'方法中那樣對抗症狀。什麼是「ConsumeProcess.process」呢? –

+0

@Gert Arnold ConsumeProcess.process不會更改userInfo,但我不知道爲什麼當我啓動savechange函數時。關於userInfo的更新sql已經執行。價值已經改變。所以我認爲原因是搜索值的狀態context.Entry(tEntity).State = EntityState.modify,所以我改變了狀態,因爲如果我想改變值,我應該處理更新函數,而不是改變get函數的值 – user2702915

回答

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(); 
}