2011-06-21 22 views
0

我有以下几点:实体框架的更新和插入Issue-ASP.NET MVC


public void SaveChanges(Project project, int ParentId) 
     { 
//If not updating then insert 
if (!UpdateMode) 
      { 
       //Insert New Project Else Simply Save Context Changes 
       this.Context.Projects.Add(project);  
      } 
//save all changes 
      this.Context.SaveChanges(); 
} 

的想法是,如果我在插入模式增加新的项目还有我在更新模式,我需要只需保存所有更改即可。我传入的项目具有在网页中进行的更改,但未保存。不应该做以下工作?

public void SaveChanges(Project project, int ParentId)

+0

你怎么知道它在updatemode? – David

+0

您需要添加更多信息。例如你没有说过什么是错的。当你运行上面的时候会发生什么? – OpticalDelusion

回答

1

从张贴的形式进来的项目没有连接到您的对象上下文。您需要将其附加到上下文。

public void SaveChanges(Project project, int ParentId)  { 
    //If not updating then insert 
    if (!UpdateMode)   {     
     //Insert New Project Else Simply Save Context Changes     
     this.Context.Projects.Add(project);     
    } else { 
     this.Context.Attach(project); 
     this.Context.ObjectStateManager.ChangeObjectState(project, EntityState.Modified); 
    } 
    //save all changes    
    this.Context.SaveChanges(); 
} 
+0

4.1的语法是什么? ObjectStateManager似乎不存在。 – Keith

+0

找到了: this.Context.Entry(project).State = System.Data.EntityState.Modified; – Keith

+0

这工作!多谢你们 – Keith

0

你的项目对象(如果它的更新,而不是插入)MUST从你在调用的SaveChanges同一数据上下文对象中加载。如果您从一个库中的上下文加载项目并传递该项目,则更新将失败。这是EF/Linq-To-Sql的其中一个重要部分。

看看“附加”方法将一个现有的实体附加到不同的数据上下文,但要注意的是,就我所知,没有神奇的项目符号。 (仍在寻找它自己)