2014-11-04 44 views
0

目前,我在通用信息庫實現了這個功能更新數據不會更新之後調用.CurrentValues.SetValues

public virtual void Update(TEntity entity) 
    { 
     var dbContext = _context as DbContext; 

     var entry = dbContext.Entry(entity); 
     var key = GetPrimaryKey(entry); 

     if (entry.State == EntityState.Detached) 
     { 
      var currentEntry = _dbSet.Find(key); 
      if (currentEntry != null) 
      { 
       dbContext.Entry(currentEntry).CurrentValues.SetValues(entity); 
       dbContext.Entry(currentEntry).State = EntityState.Modified; 
      } 
      else 
      { 
       _dbSet.Attach(entity); 
       entry.State = EntityState.Modified; 
      } 
     } 
     dbContext.SaveChanges(); 
    } 

我試圖調試,發現「currentEntry」的值更新爲同作爲「實體」。但數據庫中的數據不會更新。如果您有任何解決方案,請幫助。

+0

當你監視由SaveChanges執行的SQL時,你會看到什麼? – 2014-11-04 07:57:38

回答

1

我有更新的方法對我的通用倉庫一個簡單的工作版本,看看是否有幫助:

public int Update<T>(T item) where T : class 
    { 
     Guard.ArgumentNotNull(item, "item"); 

     Set<T>().Attach(item); 

     // Calling State on an entity in the Detached state will call DetectChanges() 
     // which is required to force an update. 
     Entry(item).State = EntityState.Modified; 

     return SaveChanges(); 
    } 

而且由於EF內部跟蹤實體,調用此方法會拋出異常「的對象具有相同鍵已經存在於ObjectStateManager的ObjectStateManager不能用相同的密鑰跟蹤多個對象「

我已經停用實體跟蹤在下面我查詢方法解決了這個問題:。

public IQueryable<T> Query<T>() where T : class 
    { 
     return Set<T>().AsNoTracking(); 
    } 
+0

我之前使用過你的解決方案,它必須拋出異常「ObjectStateManager中已經存在具有相同鍵的對象,ObjectStateManager不能使用相同的鍵跟蹤多個對象。」 – 2014-11-04 07:08:51

+0

@ conanak99 - 這可能是由於內部實體跟蹤。我使用Set ().AsNoTracking();將查詢方法設置爲關閉。請參閱我更新的答案。 – SBirthare 2014-11-04 07:21:30

相關問題