MVC 4,EF 5 SaveChanges不更新数据库

时间:2012-12-18 11:13:40

标签: c# asp.net-mvc entity-framework asp.net-mvc-4

我对此比较陌生,但我仍然有点尴尬,因为这真的应该很简单......

我要做的就是更新数据库表中的现有行。我首先使用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();
        }

2 个答案:

答案 0 :(得分:4)

我已设法使用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();

答案 1 :(得分:0)

试试这个

[HttpPost]
public ActionResult Edit(CitizenEntryViewModel citizenDetails)
{
    ActiveCitizen activeCitizen = db.ActiveCitizen.SingleOrDefault(m => m.ID == citizenDetails.ActiveCitizen.ID);

    if (activeCitizen != null)
    {
        UpdateModel(activeCitizen);
        db.SaveChanges();
    }