C# MVC 4、EF 5保存更改不更新数据库

C# MVC 4、EF 5保存更改不更新数据库,c#,asp.net-mvc,entity-framework,asp.net-mvc-4,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,我对这个比较陌生,但我还是有点尴尬,因为这真的应该很简单 我所要做的就是更新数据库表中的现有行。我首先使用EF(我相信是5)代码 对于MVC 3,我使用了这种方法(有效): 我已经尝试了一些我发现的例子,虽然它们没有错误,但数据库没有得到更新 [HttpPost] public ActionResult Edit(CitizenEntryViewModel citizenDetails) { ActiveCitizen activeCitizen = db.ActiveC

我对这个比较陌生,但我还是有点尴尬,因为这真的应该很简单

我所要做的就是更新数据库表中的现有行。我首先使用EF(我相信是5)代码

对于MVC 3,我使用了这种方法(有效):

我已经尝试了一些我发现的例子,虽然它们没有错误,但数据库没有得到更新

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

我已使用中提到的以下代码解决了此问题,其中显示了如何仅保存新值:

db.Entry(activeCitizen).CurrentValues.SetValues(citizenDetails.ActiveCitizen);
注意,我遇到了错误:“ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同键的多个对象”

帮助我克服了这个问题

因此,最后的守则是:

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

我已使用中提到的以下代码解决了此问题,其中显示了如何仅保存新值:

db.Entry(activeCitizen).CurrentValues.SetValues(citizenDetails.ActiveCitizen);
注意,我遇到了错误:“ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同键的多个对象”

帮助我克服了这个问题

因此,最后的守则是:

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

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

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

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

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

无需手动将对象状态更改为
modified
。模型中的
IP
属性是否正确链接到数据库?是否尝试更改原始
activeCitizen
对象的属性并保存它?或者调用
db.ObjectStateManager.ChangeObjectState(activeCitizen,EntityState.Modified)
before
db.SaveChanges()?谢谢。Silvermind,第一个代码示例取自一段时间前的MVC3项目。Zabavsky,我确实尝试了将状态更改为
modified
的方法,但我似乎没有访问
ObjectStateManager
。VS Express 2012说:“ActiveCitizenSystem.Models.acSenties”不包含ObjectStateManager的定义。我有名称空间条目:
使用System.Data.Objects好的,我刚刚看到EF4.0使用ObjectContext类,而版本4.1使用DbContext类,在DbContext类中定义了Set和Entry等方法。因此,我使用了以下语法:
db.Entry(activeCitizen).State=System.Data.EntityState.Modified现在有一条错误消息:“ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同键的多个对象。”无需手动将对象状态更改为
已修改
。模型中的
IP
属性是否正确链接到数据库?是否尝试更改原始
activeCitizen
对象的属性并保存它?或者调用
db.ObjectStateManager.ChangeObjectState(activeCitizen,EntityState.Modified)
before
db.SaveChanges()?谢谢。Silvermind,第一个代码示例取自一段时间前的MVC3项目。Zabavsky,我确实尝试了将状态更改为
modified
的方法,但我似乎没有访问
ObjectStateManager
。VS Express 2012说:“ActiveCitizenSystem.Models.acSenties”不包含ObjectStateManager的定义。我有名称空间条目:
使用System.Data.Objects好的,我刚刚看到EF4.0使用ObjectContext类,而版本4.1使用DbContext类,在DbContext类中定义了Set和Entry等方法。因此,我使用了以下语法:
db.Entry(activeCitizen).State=System.Data.EntityState.Modified现在有一条错误消息:“ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同键的多个对象。”请访问Joe Stevens博客,了解更新模型的工作原理。谢谢我尝试了
UpdateModel
方法,但收到以下错误:“无法更新类型为“ActiveCitizenSystemicm.Models.ActiveCitizen”的模型。”我添加了一种在下面有效的方法。非常感谢。访问Joe Stevens博客,了解更新模型的工作原理。谢谢我尝试了
UpdateModel
方法,但收到以下错误:“无法更新类型为“ActiveCitizenSystemicm.Models.ActiveCitizen”的模型。”我添加了一种在下面有效的方法。非常感谢。