9

我的更新方法在ASP.NET MVC 3應用程序中不起作用。我用下面EF 4.1代碼:context.SaveChanges不起作用

[HttpPost] 
public ActionResult UpdateAccountDetails(Account account) 
{ 
    if (ModelState.IsValid) 
    { 
     service.SaveAccount(account); 
    } 
} 

SaveAccount看起來是這樣的:

internal void SaveAccount(Account account) {   
    context.SaveChanges(); 
} 
+1

是你的實體連接還是分離? – msmucker0527

+0

我不確定附着或分離是什麼意思... – DotnetSparrow

+1

您可以提供記錄/實體插入/更新的服務部分嗎?我懷疑你有使用條款。 –

回答

12
internal void SaveAccount(Account account) { 

    // Load current account from DB 
    var accountInDb = context.Accounts.Single(a => a.Id == account.Id); 

    // Update the properties 
    context.Entry(accountInDb).CurrentValues.SetValues(account); 

    // Save the changes 
    context.SaveChanges(); 
} 

備選:

internal void SaveAccount(Account account) { 

    context.Entry(account).State = EntityState.Modified; 
    context.SaveChanges(); 
} 
1

您沒有進行任何更改,所以實在沒有什麼要保存。最簡單的方法可能是這樣做:

internal void SaveAccount(Account account) 
{ 
    context.Attach(account); 
    ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(account); 
    entry.SetModified(); 

    context.SaveChanges(); 
} 
2

這裏的問題是,你沒有考慮到網頁是無狀態的事實。您可能使用從數據庫返回的帳戶數據對您的頁面進行puppet處理,但是在請求結束時該對象被銷燬。

回發時,模型綁定器創建了一個新的Acccount對象,但是這個對象並沒有連接到數據庫,因此您的數據庫上下文不知道它甚至存在。所以當你打電話給SaveChanges時,沒有什麼變化。

您必須從數據庫獲取新的Account對象,並使用來自模型聯編程序創建的Account的數據更新其字段,或者將新帳戶對象附加到數據庫。