9

ASP.NET MVC 3アプリケーションで、私の更新メソッドが動作しません。このようになりますcontext.SaveChangesが動作しない

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

SaveAccount:私は、次のEF 4.1のコードを使用している

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

ここでの問題は、Webページがステートレスであるという事実を考慮していないことです。おそらく、データベースから返されたアカウントデータでページを偽造しますが、要求の最後にオブジェクトが破棄されます。

ポストバックでは、モデルバインダーによって新しいAcccountオブジェクトが作成されますが、これはデータベースにフックアップされないため、データベースコンテキストにも存在しないことがあります。したがって、SaveChangesを呼び出すと、それが関係する限り何も変更されていません。

データベースから新しいAccountオブジェクトを取得し、作成したモデルバインダーのデータでそのフィールドを更新するか、新しいアカウントオブジェクトをデータベースに追加する必要があります。

関連する問題