【问题标题】:Entity Framework - partial commit实体框架 - 部分提交
【发布时间】:2009-10-24 06:02:56
【问题描述】:

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

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

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

在 ADO.NET 数据集中,有一种单独提交更改的方法 - 获取更改,做一些必要的工作,甚至拒绝更改。

ADO.NET Entity Framework 可以做到这一点吗?

【问题讨论】:

    标签: c# entity-framework ado.net


    【解决方案1】:

    我不确定我是否正确/完全理解了您的问题,但大多数需求都应该在一个上下文中轻松处理。下面是一个将某种类型的所有对象恢复到其原始状态的简单示例,如果您在此之后在上下文上调用 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);
          }
       }
    }
    

    我要说明的一点是,如果您跟踪要“部分”提交的项目,您可以进行很多控制。您想要恢复到原始状态或丢弃的那些可以恢复甚至完全从上下文中删除。

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

    【讨论】:

    • 谢谢。这是迄今为止最好的答案,所以我将其标记为正确。总而言之:没有内置的机制来做某事。就像在数据集中一样。我知道解决方法,但我真正想知道的是我是否没有遗漏任何东西。
    【解决方案2】:

    我的理解是实体框架中的提交本地化到实体项所附加的数据上下文。如果您想在处理其他数据时进行部分提交,那么您可以创建一个新的数据上下文,加载您需要的不相关的对象,进行修改并在新的数据上下文上提交。您的原始数据上下文和对象应保持不变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      相关资源
      最近更新 更多