context.SaveChanges不起作用

时间:2011-11-08 20:36:31

标签: 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(Account account) {         
    context.SaveChanges();
}

5 个答案:

答案 0 :(得分:15)

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 :(得分:3)

这里的问题是你没有考虑到网页是无状态的这一事实。您可能使用从数据库返回的帐户数据来填充页面,但随后在请求结束时销毁该对象。

在回发时,模型绑定器会创建一个新的Acccount对象,但是这个对象没有连接到数据库,因此您的数据库上下文不知道它甚至存在。因此,当您调用SaveChanges时,就其而言,没有任何改变。

您必须从数据库中获取一个新的Account对象,并使用模型绑定器创建的Account中的数据更新它的字段,或者将新的帐户对象附加到数据库。

答案 2 :(得分:1)

本文应该有所帮助

http://msdn.microsoft.com/en-us/library/bb896271.aspx

您可能需要添加context.Accounts.Attach(account);以将实体重新附加到上下文

答案 3 :(得分:1)

您没有进行任何更改,因此无需保存任何内容。最简单的方法可能是:

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

    context.SaveChanges();
}

答案 4 :(得分:0)

如果您在应用程序中使用的是selected_dates = pd.to_datetime(selected_dates) df = df[df.index.get_level_values(0).isin(selected_dates)] print (df) metric1 metric2 2020-09-02 prod1 3 30 prod2 4 40 prod3 5 50 2020-09-05 prod1 12 120 prod2 13 130 prod3 14 140 模型,请确保将所有必须更新的字段的属性.edmx设置为StoreGeneratedPattern

EF不会告诉您,实际上就像是将更改存储到数据库中一样。