2011-03-18 29 views
2

我正在開發一個使用EF4的應用程序,並創建了一個通用方法,但生成此錯誤。更新對象的一般方法(實體框架4)中的錯誤

方法:

public Boolean change (T) 
{ 
    ctx.ApplyCurrentValues ​​<T> (t.GetType(). Name, t); 
    return save(); 
} 

這就是gerendo是這樣的錯誤:

與所提供的對象的鍵匹配的鍵的對象無法在ObjectStateManager找到。驗證提供的對象的鍵值是否與必須應用更改的對象的鍵值匹配。

有誰知道如何解決這個問題?

回答

0

我不知道你是如何得到這個編譯的,因爲你使用了括號爲(T)的尖括號<T>,省略了參數t。那就是:

public Boolean change<T>(T t) 
{  
    ctx.ApplyCurrentValues <T> (t.GetType(). Name, t);  
    return save(); 
} 
0

假設你想鍵入是這樣的:

public Boolean change<T> (T t) where T : EntityObject 
{ 
    ctx.ApplyCurrentValues​​<T>(t.GetType().Name, t); 
    return save(); 
} 

失敗的原因是對象上下文尚未加載要更新的實體,您將有拉首先來自DB的實體。

這裏有一些關於如何使用存根或者通過向數據庫請求具有相同ID的實體來做到這一點的例子,但是我還沒有看到通用版本。

EntityFramework .net 4 Update entity with a simple method

Entity Framework 4 - Where to put "ApplyCurrentValues" Logic?

1

ApplyCurrentValues更新從提供離散的實體附實體值。這個例外說明你沒有使用相同的密鑰連接實體。這意味着在調用此方法之前,您沒有在同一個上下文中從數據庫加載實體。

您可以通過修改方法:

public Boolean Change<TEntity>(TEntity entity) where TEntity : EntityObject 
{ 
    // Loads object from DB only if not loaded yet 
    ctx.GetObjectByKey(entity.EntityKey); 
    ctx.ApplyCurrentValues​​<T>(entity.GetType().Name, entity); 
    ctx.SaveChanges(); 
} 
+0

+1我認爲'GetObjectByKey()'但還承擔了OP是使用從未在DB之前(即新創建的)對象 - 在這種這種情況是行不通的。 – BrokenGlass 2011-03-18 17:41:26