【发布时间】:2012-12-18 11:13:40
【问题描述】:
我对此比较陌生,但我仍然有点尴尬,因为这真的应该很简单......
我要做的只是更新数据库表中的现有行。我首先使用的是 EF(我相信是 5)代码。
对于 MVC 3,我使用了这种方法(有效):
ReportCommon reportcommon = db.ReportCommon.Single(r => r.ReportCommonId == id);
reportcommon.IP = StaticUtilities.GetIPAddress();
db.ObjectStateManager.ChangeObjectState(reportcommon, EntityState.Modified);
db.SaveChanges();
我已经尝试了一些我发现的示例,尽管它们没有出错,但数据库没有得到更新...
[HttpPost]
public ActionResult Edit(CitizenEntryViewModel citizenDetails)
{
ActiveCitizen activeCitizen = db.ActiveCitizen.SingleOrDefault(m => m.ID == citizenDetails.ActiveCitizen.ID);
if (activeCitizen != null)
{
citizenDetails.ActiveCitizen.CitizenUpdatedRecordOn = DateTime.Now;
// Fields we don't edit but still need to pass back
citizenDetails.ActiveCitizen.PublicID = activeCitizen.PublicID;
citizenDetails.ActiveCitizen.IsKIN = activeCitizen.IsKIN;
activeCitizen = citizenDetails.ActiveCitizen;
db.SaveChanges();
}
【问题讨论】:
-
无需手动将对象状态更改为
modified。模型中的IP属性是否正确链接到数据库? -
您是否尝试过更改原始
activeCitizen对象的属性并保存?还是在db.SaveChanges();之前致电db.ObjectStateManager.ChangeObjectState(activeCitizen, EntityState.Modified);? -
谢谢。 Silvermind,第一个代码示例取自一段时间前的 MVC 3 项目。 Zabavsky,我确实尝试过将状态更改为
modified的方法,但我似乎无法访问ObjectStateManager。 VS Express 2012 说:“ActiveCitizenSystem.Models.ACSEntities”不包含 ObjectStateManager 的定义。我确实有命名空间条目:using System.Data.Objects; -
好的,我刚刚看到 EF 4.0 使用 ObjectContext 类,而 4.1 版使用 DbContext 类,其中定义了 Set
和 Entry 等方法。因此,我使用了以下语法: db.Entry(activeCitizen).State = System.Data.EntityState.Modified;,现在有一条错误消息:“ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。”
标签: c# asp.net-mvc entity-framework asp.net-mvc-4