C# 实体框架-部分提交

C# 实体框架-部分提交,c#,entity-framework,ado.net,C#,Entity Framework,Ado.net,一段时间以来,我一直在想,在实体框架中是否有任何方法可以保存对数据库的一些更改,而不是其他更改。想象一下,我有4个实体类——Customer、Task、SalesSchema和Address。每一种都是一对多的客户关系。现在,我创建了一个包含3个选项卡(使用TabControl)的窗口,每个选项卡都有一个DataGridView,其中列出了地址、任务和销售模式,还为每个按钮(添加、修改、删除)创建了一个窗口,以处理每个实体类型的详细信息 我想做的是允许部分更改提交到数据库,例如,用户添加一个任务

一段时间以来,我一直在想,在实体框架中是否有任何方法可以保存对数据库的一些更改,而不是其他更改。想象一下,我有4个实体类——Customer、Task、SalesSchema和Address。每一种都是一对多的客户关系。现在,我创建了一个包含3个选项卡(使用TabControl)的窗口,每个选项卡都有一个DataGridView,其中列出了地址、任务和销售模式,还为每个按钮(添加、修改、删除)创建了一个窗口,以处理每个实体类型的详细信息

我想做的是允许部分更改提交到数据库,例如,用户添加一个任务->当用户点击保存更改时,应该立即保存该任务,但应该只保存活动选项卡中的更改。(不要问我为什么要这样做——这是客户想要的)

现在可以通过创建单独的数据上下文并分别提交其中的每一个来实现,但我想知道是否还有其他方法可以做到这一点——使用一个对象上下文

在ADO.NET数据集中,有一种单独提交更改的方法—获取更改、执行一些必要的工作人员,甚至拒绝更改


使用ADO.NET实体框架是否可以实现这一点?

我的理解是,实体框架中的提交被本地化为实体项所附加到的数据上下文。如果希望在处理其他数据时执行部分提交,则可以创建新的数据上下文,加载所需的非相关对象,进行修改并在新的数据上下文上提交。您的原始数据上下文和对象应该保持不变和未注释。

我不确定是否正确/完整地理解了您的问题,但大多数需求应该使用一个上下文轻松处理。下面是一个简单的示例,说明如何将特定类型的所有对象还原为其原始状态,如果在此之后要对上下文调用SaveChanges(),则只有处于添加或更改状态的剩余对象才会提交部分提交

foreach (System.Data.Objects.ObjectStateEntry x in MyEntity.ObjectStateManager.GetObjectStateEntries(EntityState.Added)) // or modified for that matter.
{
   if (x.EntityKey != null)
   {  
      if (x.Entity is MyClass) // look haven't tested this code, merely example and may have typo's
      {
         MyClass tmpObject = (MyClass)x.Entity;
         MyEntity.Refresh(RefreshMode.StoreWins, x);
      }
   }
}
我想说明的一点是,如果您跟踪要“部分”提交的项目,那么您可以使用很多控制。您想要恢复到原始状态或放弃的内容可以恢复,甚至可以从上下文中完全删除


不确定这是否有帮助。祝你好运。

谢谢。这是目前为止最好的答案,所以我将把它标记为正确。总而言之:没有像在数据集中那样的内置机制。我知道解决办法,但我真正想知道的是我是否错过了任何东西。