【问题标题】:MVC 4, EF 5 SaveChanges does not update databaseMVC 4、EF 5 SaveChanges 不更新数据库
【发布时间】: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


【解决方案1】:

我已经设法使用this SO post 中提到的以下代码解决了这个问题,该代码显示了如何仅保存新值:

db.Entry(activeCitizen).CurrentValues.SetValues(citizenDetails.ActiveCitizen);

注意,我遇到了错误:“ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象”

This SO post 帮助我克服了这个问题。

因此最终的代码是:

var currentCitizen = db.ActiveCitizen.Find(citizenDetails.ActiveCitizen.ID);
db.Entry(currentCitizen).CurrentValues.SetValues(citizenDetails.ActiveCitizen);
db.SaveChanges();

【讨论】:

    【解决方案2】:

    试试这个

    [HttpPost]
    public ActionResult Edit(CitizenEntryViewModel citizenDetails)
    {
        ActiveCitizen activeCitizen = db.ActiveCitizen.SingleOrDefault(m => m.ID == citizenDetails.ActiveCitizen.ID);
    
        if (activeCitizen != null)
        {
            UpdateModel(activeCitizen);
            db.SaveChanges();
        }
    

    【讨论】:

    • 访问 Joe Stevens 博客,了解更新模型的工作原理。 joe-stevens.com/2010/02/17/…
    • 谢谢。我尝试了UpdateModel 方法并收到以下错误:'无法更新'ActiveCitizenSystemMimic.Models.ActiveCitizen'类型的模型。'我添加了一种适用于下面的方法。非常感谢。
    猜你喜欢
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    相关资源
    最近更新 更多