【问题标题】:Entity Framework reverting changes实体框架还原更改
【发布时间】:2023-04-09 17:29:01
【问题描述】:

我正在开发一个包含 4 个步骤的向导的 Web 表单:

在每一步中,我都会创建从数据库生成的新实体。

问题在于,作为一个向导,用户可以更改将产生要存储的值的控件的属性。

所以我需要释放创建的实体对象或将该实体值返回到存储在数据库中的原始行。

我该怎么做。

如果我将每个创建的实体对象都设置为空,它应该工作吗?

顺便说一句,我就是这样做的:

entities = new Entities();

...

Client client = new Client();
client.name = tbxName.text

...

entities.SaveChanges();
entities.Connection.Close();   

因此,如果此代码在由 3 个部分组成的向导的第二个向导部分执行,并且一旦客户端创建运行不止一次,我就会在此集合中回过头来,所以这就是我的问题。

那么我该如何取消创建它:-P

谢谢!!!

【问题讨论】:

    标签: asp.net entity-framework revert


    【解决方案1】:

    如果您正在构建向导,则必须将其作为单个操作进行管理。这意味着您必须将构建的实体图存储在会话中,并仅在整个向导完成并确认后才保存。您的步骤逻辑还必须检查实体图中是否已经存在相关数据并使用它们而不是创建新数据。

    【讨论】:

    • 感谢您的 re+ly 一个例子会很好:-P
    • 感谢 Yakimych 的有用建议...我现在已经处理好了
    • @RedEagle:你期待什么样的例子?
    • 就像我说的,关于上面的代码当我这样做时: Client client = new Client(); client.name = tbxName.text 该客户端设置在缓存中,当我这样做时:entities.SaveChanges();该客户端已插入数据库...我需要的是一个示例,说明如何使用 SaveChanges 方法调用撤消此插入 感谢您的帮助!
    • 只有在向导的最后一步用户确认后才能保存更改。如果您在任何其他步骤中保存任何内容,它只会被保存,您只能从数据库中删除它。不存在还原。
    【解决方案2】:

    如果您使用实体框架,为什么不实现工作单元模式?向导的每个部分都构建 UoW,“最后一步”提交工作单元。

    几年前在 MSDN 杂志上有一篇名为“The Unit Of Work Pattern And Persistence Ignorance”的文章解释了这个概念。

    【讨论】:

      【解决方案3】:

      这就是我的做法:

      1- 创建一个可以管理会话变量的地方:

      public class SessionObjects { }
      

      2- 我将我的 ObjectContext 保存在 Session 中,因此我创建了一个属性来在提到的类中管理它:

      public static ObjectContextEntities ObjectContextEntities
      {
          get
          {
              return (ObjectContextEntities)HttpContext.Current.Session["ObjectContextEntities"];
          }
          set
          {
              HttpContext.Current.Session["ObjectContextEntities"] = value;
          }
      
      }
      

      3- 在向导开始时初始化 ObjectContext 并在结束时处理它:

      void StartWizard()
      {
          SessionObject.ObjectContextEntities = new ObjectContextEntities(); 
      }
      
      void StartWizard()
      {
          SessionObject.ObjectContextEntities = new ObjectContextEntities(); 
      }
      
      void EndWizard()
      {
          ((ObjectContextEntities)SessionObject.ObjectContextEntities).Dispose();
      }
      

      4- 要将向导结果保存到数据库,您可以调用:

      void SaveWizard()
      {
          ((ObjectContextEntities)SessionObject.ObjectContextEntities).SaveAllChanges();
      }
      

      5- 要重置向导,只需调用 EndWizard 然后 StartWizard 。

      我猜你知道如何在 ObjectContext 中管理你的 ObjectEntity 对象,所以你可以自己从这里继续..

      【讨论】:

        猜你喜欢
        • 2020-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        • 2011-07-24
        相关资源
        最近更新 更多