【问题标题】:db.SaveChanges does not save changesdb.SaveChanges 不保存更改
【发布时间】:2017-05-04 20:25:20
【问题描述】:

有人可以帮我解决db.SaveChanges 吗?它不保存对对象所做的更改。我已经添加了项目模型。

public class Project
    {
        public int ProjectID { get; set; }        
        public String Name { get; set; }    
        public virtual ICollection<ProjectParam> ProjectParams { get; set; }       
    }    



// Project object
Project project = new Project { Name = ProjectName, ProjectID = ProjectID };
project.ProjectParams = new List<ProjectParam>();

// Update all params
for (int i = 0; i < ParamIDs.Length; i++)            
    project.ProjectParams.Add(new ProjectParam { ParamID = Convert.ToInt32(ParamIDs[i]), 
                                                 ParamValue = ParamValues[i],
                                                 ProjectID = ProjectID });

// Save changes
if (ModelState.IsValid)
{
    db.Entry(project).State = EntityState.Modified;                               
    db.SaveChanges();

    return RedirectToAction("Index");
}

return RedirectToAction("Index");

【问题讨论】:

  • ModelState.IsValidtruedb.SaveChanges(); 肯定被调用?
  • Spender 谢谢你的评论,我在里面放了一个断点。是的,正在调用 ModelState.IsValid 中的代码。

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


【解决方案1】:

在设置 Entry.State 并调用 SaveChanges() 之前,将项目附加到您的项目实体,如下所示:

db.Projects.Attach(project);
db.Entry(project).State = EntityState.Modified;                               
db.SaveChanges();

【讨论】:

  • 没有。将状态设置为Modified 就足够了。它还附加对象。请删除此答案,它只会带来混乱。
  • @GertArnold:因为它是一个全新的对象,所以状态可能应该设置为Added - 而不是Modified ....
  • @marc_s 不一定。这是更新现有对象的有效方法。
  • @GertArnold:好的 - 确实如此 - 但对我来说,在这种情况下(更新现有对象),从首先上下文,修改一些属性,然后保存。这似乎有点“侧边”——创建一个新对象来“模仿”现有对象,然后对其进行调整......无论如何——但你是对的——将.State 设置为 modified 实际上将对象附加到上下文
  • 谢谢你们的cmets。我仍在努力。一旦找到根本原因,我将立即更新此线程。我打算试试marc_s 建议的侧身。
【解决方案2】:

这就是我为解决这个问题所做的。这似乎工作正常。感谢大家的时间。

public ActionResult Edit(int ProjectID,string ProjectName,string[] ParamIDs,string[] ParamValues)
        {
            // Get project from context
            Project project = db.Projects.Where(e => e.ProjectID == ProjectID).SingleOrDefault();
            project.Name = "Hi";

            // Remove existing parameters
            db.ProjectParams.RemoveRange(db.ProjectParams.Where(c => c.ProjectID == ProjectID));

            // Add new list of parameters
            project.ProjectParams= new List<ProjectParam>();

            //// Update all params
             for (int i=0;i< ParamIDs.Length;i++)
                project.ProjectParams.Add(new ProjectParam { ParamID = Convert.ToInt32(ParamIDs[i]),ParamValue=ParamValues[i],ProjectID=ProjectID });

            // Save changes
            if (ModelState.IsValid)
            {
                db.Entry(project).State = EntityState.Modified;                               
                db.SaveChanges();

                return RedirectToAction("Index");
            }
            return RedirectToAction("Index");            
        }

【讨论】:

    猜你喜欢
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 2014-10-16
    • 2017-12-18
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多