Asp.net mvc context.SaveChanges不起作用

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

我的更新方法在ASP.NET MVC 3应用程序中不起作用。我使用了以下EF 4.1代码:

[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子句。