我試圖更新使用實體框架版本6.無法更新實體使用EF 6 - ObjectStateManager錯誤
我是從像這樣的數據庫選擇實體的實體...
public T Find<T>(object id) where T : class
{
return this._dbContext.Set<T>().Find(id);
}
和更新,像這樣的實體..
public T Update<T>(T entity) where T : class
{
// get the primary key of the entity
object id = this.GetPrimaryKeyValue(entity);
// get the original entry
T original = this._dbContext.Set<T>().Find(id);
if (original != null)
{
// do some automatic stuff here (taken out for example)
// overwrite original property values with new values
this._dbContext.Entry(original).CurrentValues.SetValues(entity);
this._dbContext.Entry(original).State = EntityState.Modified;
// commit changes to database
this.Save();
// return entity with new property values
return entity;
}
return default(T);
}
的GetPrimaryKeyValue功能是如此...
private object GetPrimaryKeyValue<T>(T entity) where T : class
{
var objectStateEntry = ((IObjectContextAdapter)this._dbContext).ObjectContext
.ObjectStateManager
.GetObjectStateEntry(entity);
return objectStateEntry.EntityKey.EntityKeyValues[0].Value;
}
只是爲了清晰。我正在選擇原始條目,因爲我需要執行一些併發邏輯(我已經取出)。我不會將這些數據發佈到實體,並且需要再次手動從數據庫中選擇它以執行檢查。
我知道如果實體上有多個主鍵,GetPrimaryKeyValue函數並不理想。我只是想讓它現在工作。
更新時,實體框架在嘗試執行GetPrimaryKeyValue函數時咳嗽下面的錯誤。
的ObjectStateManager不包含ObjectStateEntry一起類型的對象的引用「NAME_OF_ENTITY_IT_CANNOT_FIND」
我之前寫了很多庫,我從來沒有過這樣的問題,我似乎無法找到原因它不工作(因此後)。
任何幫助將不勝感激。
謝謝你們!
史蒂夫
我有點被你的代碼混淆。您的變更跟蹤器中是否有T實體?因爲如果是這樣,那麼調用_dbContext.Set().Find(id)不會進行數據庫查詢。它會查看變更跟蹤器,看它是否已經存在(它會是),然後給你同一個實體。所以原創和實體在這一點上是相同的參考。 –
Dismissile
2014-09-19 12:34:15
與上面的註釋相關,如果T實體在更改跟蹤器中被傳遞到Update方法中,那麼您不能調用CurrentValues()。 – Dismissile 2014-09-19 12:36:32
嗨Dismissile。即使我拿出所有的代碼,然後留在'this._dbContext.Entry(ENTITY).State = EntityState.Modified;'。我仍然得到錯誤。'一個實體對象不能被IEntityChangeTracker的多個實例引用。'這是否意味着它已經是變更追蹤器的一部分? – Hemslingo 2014-09-19 12:43:35