Asp.net mvc context.SaveChanges不起作用
我的更新方法在ASP.NET MVC 3应用程序中不起作用。我使用了以下EF 4.1代码:Asp.net mvc context.SaveChanges不起作用,asp.net-mvc,asp.net-mvc-3,entity-framework,entity-framework-4.1,Asp.net Mvc,Asp.net Mvc 3,Entity Framework,Entity Framework 4.1,我的更新方法在ASP.NET MVC 3应用程序中不起作用。我使用了以下EF 4.1代码: [HttpPost] public ActionResult UpdateAccountDetails(Account account) { if (ModelState.IsValid) { service.SaveAccount(account); } } 而SaveAccount看起来是这样的: internal void SaveAccount(Accou
[HttpPost]
public ActionResult UpdateAccountDetails(Account account)
{
if (ModelState.IsValid)
{
service.SaveAccount(account);
}
}
而SaveAccount
看起来是这样的:
internal void SaveAccount(Account account) {
context.SaveChanges();
}
这篇文章应该会有所帮助 您可能需要添加
context.Accounts.Attach(account)
将实体重新附加到上下文
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();
}
您没有进行任何更改,因此实际上没有要保存的内容。最简单的方法可能是执行以下操作:
internal void SaveAccount(Account account)
{
context.Attach(account);
ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(account);
entry.SetModified();
context.SaveChanges();
}
这里的问题是你没有考虑到网页是无状态的。您可能使用从数据库返回的帐户数据创建页面,但在请求结束时,对象将被销毁 回发时,模型绑定器会创建一个新的Account对象,但这个对象没有连接到数据库,因此您的数据库上下文甚至不知道它是否存在。因此,当您调用SaveChanges时,就其而言没有任何更改
您必须从数据库中获取新帐户对象,并使用model binder创建的帐户中的数据更新其字段,或者将新帐户对象附加到数据库。如果您在应用程序中使用
.edmx
模型,确保所有必须更新的字段的属性StoreGeneratedPattern
都设置为none
EF不会告诉您,它的行为就像是在存储对数据库的更改,而事实上它不是。您的实体是附加的还是分离的?我不确定附加的或分离的意思是什么…您能提供插入/更新记录/实体的服务部分吗。我怀疑你有一个using子句。