Entity framework 4 实体框架4.0中的回滚

Entity framework 4 实体框架4.0中的回滚,entity-framework-4,foreign-key-relationship,Entity Framework 4,Foreign Key Relationship,我有一个Customer类,其中包括一个Contact类,该类存储该特定客户的所有联系人,因此它们与外键关系相链接 下面是我的场景:用户编辑包括联系人在内的客户信息,然后决定点击“取消”按钮。联系人绑定到网格,因此每次进行编辑/添加/删除时,它都会自动更新缓存数据库上下文中的联系人实体。那么,如何回滚用户对联系人实体所做的所有更改呢 我尝试了以下方法(在谷歌搜索答案后): 但那没用。还有其他想法吗?请注意,我的问题只是回滚联系人实体。我想首先导致问题的原因是网格自动更新缓存的实体。因此,当我尝试

我有一个Customer类,其中包括一个Contact类,该类存储该特定客户的所有联系人,因此它们与外键关系相链接

下面是我的场景:用户编辑包括联系人在内的客户信息,然后决定点击“取消”按钮。联系人绑定到网格,因此每次进行编辑/添加/删除时,它都会自动更新缓存数据库上下文中的联系人实体。那么,如何回滚用户对联系人实体所做的所有更改呢

我尝试了以下方法(在谷歌搜索答案后):

但那没用。还有其他想法吗?请注意,我的问题只是回滚联系人实体。我想首先导致问题的原因是网格自动更新缓存的实体。因此,当我尝试取消时,每个联系人的EntityState都已更改为修改状态(EntityState.Added、EntityState.Deleted等)。我是否需要遍历这些联系人并检查其EntityState属性并对其进行处理

谢谢 凯撒

看看这个方法。也可能有帮助
另一个解决方案是使用ObjectContext实例作为工作单元,并为操作创建它,并且仅在必要时保存更改(当用户确认有必要时),在另一种情况下仅处理上下文-这将放弃对上下文所做的更改。

查看该方法。也可能有帮助

另一个解决方案是使用ObjectContext实例作为工作单元,并为操作创建它,并且仅在必要时保存更改(当用户确认有必要时),在另一种情况下仅处理上下文-这将放弃对上下文所做的更改。

下面是我所做的,这是EntityFramework1.0中的一个解决方法,我希望EF4.0有一种更简单的方法来回滚对象上下文。如果您知道更好的方法,请与我分享,这似乎暂时有效:

        // delete added objects that did not get saved
        foreach (var entry in dbContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added))
        {
            if (entry.Entity != null)
                dbContext.DeleteObject(entry.Entity);
        }
        // Refetch modified objects from database
        foreach (var entry in dbContext.ObjectStateManager.GetObjectStateEntries(EntityState.Modified))
        {
            if (entry.Entity != null)
                dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, entry.Entity);
        }
        // Recover modified objects that got deleted
        foreach (var entry in dbContext.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted))
        {
            if (entry.Entity != null)
                dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, entry.Entity);
        }

        dbContext.AcceptAllChanges();

这就是我所做的,这是EntityFramework1.0中的一个解决方法,我希望EF4.0有一个更简单的方法来回滚对象上下文。如果您知道更好的方法,请与我分享,这似乎暂时有效:

        // delete added objects that did not get saved
        foreach (var entry in dbContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added))
        {
            if (entry.Entity != null)
                dbContext.DeleteObject(entry.Entity);
        }
        // Refetch modified objects from database
        foreach (var entry in dbContext.ObjectStateManager.GetObjectStateEntries(EntityState.Modified))
        {
            if (entry.Entity != null)
                dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, entry.Entity);
        }
        // Recover modified objects that got deleted
        foreach (var entry in dbContext.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted))
        {
            if (entry.Entity != null)
                dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, entry.Entity);
        }

        dbContext.AcceptAllChanges();

但是如果我处理了上下文,那么我将不得不重新获取应用程序其余部分的所有数据……这将是糟糕的。我会搜索你关于工作单位的建议。谢谢,但是如果我处理了上下文,那么我将不得不重新获取应用程序其余部分的所有数据……这将是糟糕的。我会搜索你关于工作单位的建议。感谢上下文是一个工作单元。“回滚”工作的方法是处理上下文。听起来你似乎把上下文保留得太久了。这会产生深远的负面影响。下面的u和Devart都建议处理上下文,但这不意味着我必须从数据库中重新获取所有数据吗?这会影响绩效。顺便说一句,这不是一个上下文存在时间过长的问题,因为这个问题发生在我启动应用程序的早期。我是唯一一个测试它的用户,所以也没有并发问题。你在过早地优化。如果使用单例上下文,您的长期性能可能已经很差了。与其因为想象中的性能影响而拒绝正确的实践,不如按照预期的方式使用上下文,然后通过分析和点修复来修复任何性能问题。谢谢Craig,我非常希望有一个链接提供一个好的可靠教程。我似乎找不到好的。我来自NHibernate,我刚刚开始了解EF4.0。从理论上讲,这似乎很容易,但怪癖和未记录的问题是一大挫折。任何帮助都将不胜感激。感谢您在EF中使用ObjectContext,就像在NH中使用会话一样。这几乎是相同的想法。在这两种情况下,它们都是一个工作单元。上下文旨在成为一个工作单元。“回滚”工作的方法是处理上下文。听起来你似乎把上下文保留得太久了。这会产生深远的负面影响。下面的u和Devart都建议处理上下文,但这不意味着我必须从数据库中重新获取所有数据吗?这会影响绩效。顺便说一句,这不是一个上下文存在时间过长的问题,因为这个问题发生在我启动应用程序的早期。我是唯一一个测试它的用户,所以也没有并发问题。你在过早地优化。如果使用单例上下文,您的长期性能可能已经很差了。与其因为想象中的性能影响而拒绝正确的实践,不如按照预期的方式使用上下文,然后通过分析和点修复来修复任何性能问题。谢谢Craig,我非常希望有一个链接提供一个好的可靠教程。我似乎找不到好的。我来自NHibernate,我刚刚开始了解EF4.0。从理论上讲,这似乎很容易,但怪癖和未记录的问题是一大挫折。任何帮助都将不胜感激。感谢您在EF中使用ObjectContext,就像在NH中使用会话一样。这几乎是相同的想法。在这两种情况下,它们都是一个工作单元。