我的更新方法在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();
}
答案 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不会告诉您,实际上就像是将更改存储到数据库中一样。