Dot*_*row 10 asp.net-mvc entity-framework entity-framework-4.1 asp.net-mvc-3
我的更新方法不适用于ASP.NET MVC 3应用程序.我使用了以下EF 4.1代码:
[HttpPost]
public ActionResult UpdateAccountDetails(Account account)
{
if (ModelState.IsValid)
{
service.SaveAccount(account);
}
}
Run Code Online (Sandbox Code Playgroud)
并且SaveAccount
看起来是这样的:
internal void SaveAccount(Account account) {
context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
Sla*_*uma 16
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();
}
Run Code Online (Sandbox Code Playgroud)
替代方案:
internal void SaveAccount(Account account) {
context.Entry(account).State = EntityState.Modified;
context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是您没有考虑到 Web 页面是无状态的这一事实。您可能使用从数据库返回的帐户数据填充页面,但是该对象在请求结束时被销毁。
在回发时,模型绑定器创建了一个新的 Acccount 对象,但是这个对象没有连接到数据库,因此您的数据库上下文甚至不知道它是否存在。因此,当您调用 SaveChanges 时,就它而言,没有任何变化。
您必须从数据库中获取一个新的 Account 对象并使用模型绑定器创建的 Account 中的数据更新它的字段,或者将新的 account 对象附加到数据库。
归档时间: |
|
查看次数: |
24782 次 |
最近记录: |