MVC 4,5 EF的SaveChanges不更新数据库 [英] MVC 4, EF 5 SaveChanges does not update database

查看:1211
本文介绍了MVC 4,5 EF的SaveChanges不更新数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是比较新的,但我还是有点不好意思,因为这确实应该是简单的...

所有我想要做的是在数据库表更新现有行。我使用的EF(5我相信)code第一。

有关MVC 3我用这个方法(它的工作):

  ReportCommon reportcommon = db.ReportCommon.Single(R = GT; r.ReportCommonId == ID);
reportcommon.IP = StaticUtilities.GetIPAddress();
db.ObjectStateManager.ChangeObjectState(reportcommon,EntityState.Modified);
db.SaveChanges();

我试过,我已经找到了几个例子,虽然他们没有错误的数据库没有更新...

  [HttpPost]
公众的ActionResult编辑(CitizenEntryViewModel citizenDetails)
    {
        ActiveCitizen activeCitizen = db.ActiveCitizen.SingleOrDefault(M => m.ID == citizenDetails.ActiveCitizen.ID);        如果(activeCitizen!= NULL)
        {
            citizenDetails.ActiveCitizen.CitizenUpdatedRecordOn = DateTime.Now;
            //领域我们不编辑,但仍需要回传
            citizenDetails.ActiveCitizen.PublicID = activeCitizen.PublicID;
            citizenDetails.ActiveCitizen.IsKIN = activeCitizen.IsKIN;
            activeCitizen = citizenDetails.ActiveCitizen;
            db.SaveChanges();
        }


解决方案

我设法使用<一提到以下code来解决这个问题href=\"http://stackoverflow.com/questions/6033638/an-object-with-the-same-key-already-exists-in-the-objectstatemanager-the-object\">this SO帖子它显示了如何只保存新值:

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

请注意,我经历过的错误:具有相同键的对象已经存在于ObjectStateManager的ObjectStateManager不能用相同的密钥跟踪多个目标。

<一个href=\"http://stackoverflow.com/questions/7221349/an-object-with-the-same-key-already-exists-in-the-objectstatemanager-except\">This SO帖子帮助我克服了这个问题。

最后code,因此是:

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

I'm relatively new to this but I'm still a little embarrassed as this really should be simple...

All I'm trying to do is update an existing row in a database table. I'm using EF (5 I believe) code first.

For MVC 3 I used this approach (which worked):

ReportCommon reportcommon = db.ReportCommon.Single(r => r.ReportCommonId == id);
reportcommon.IP = StaticUtilities.GetIPAddress();
db.ObjectStateManager.ChangeObjectState(reportcommon, EntityState.Modified);
db.SaveChanges();

I've tried a few examples that I've found and although they don't error the database doesn't get updated...

[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();
        }

解决方案

I have managed to resolve this issue using the following code mentioned in this SO post which shows how to save only the new values:

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

Note, I experienced the error: "An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key"

This SO post helped me overcome that issue.

The final code was therefore:

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

这篇关于MVC 4,5 EF的SaveChanges不更新数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆