使用实体框架进行事务性(内存中)编辑

时间:2009-10-06 17:48:26

标签: entity-framework .net-3.5

DataSet(和相关对象)的旧时代,数据对象的内存中表示 - DataRowDataRowView - 支持通过{{进行的事务编辑1}},BeginEditEndEdit。两者都允许不仅仅是能够“撤消”对对象所做的更改并将其还原回其检索到的(或未初始化的)值; CancelEdit对象允许开发人员在任何状态的DataRowView上开始单个编辑操作,并撤消这些更改,而不撤消可能已经进行的其他更改。

例如,

DataRow检索为:

DataRow

Col1 | Col2 ---------------- 1 2 修改为:

DataRow

Col1 | Col2 ---------------- 1 3 为此行调用BeginEdit个对象。

DataRowView修改为:

DataRowView

Col1 | Col2 ---------------- 2 3 调用CancelEdit,将值恢复为

DataRowView

所以更改已撤消,但编辑前出现的值 - 即使它们是内存中的更改而不是检索到的值 - 也会被保留。

实体框架中是否有类似的设施?我怀疑答案是“不”,考虑到它看起来Col1 | Col2 ---------------- 1 3 使用简单的支持变量作为列值,而不是Entity使用的“属性包”方法(或WPF的DataRow基础设施使用)。

2 个答案:

答案 0 :(得分:0)

根据您需要的事务支持深度,有两种方法可以与Entity Framework进行交易。

  1. 执行此操作的“正确”方法是使用TransactionScope实例。实体框架支持这一点。此方法的缺点是您现在处于分布式事务中,这会对计算机与数据库服务器之间的连接产生安全隐患。
  2. 执行此操作的“lite”方法是使用SaveChanges的SaveOptions参数。这使您可以在调用SaveChanges后保留更改跟踪信息,并在以后“接受”更改(保存到数据库并处置更改跟踪信息)。
  3. 关于您在问题的最后一段中的推测:在EF 1中,更改跟踪信息通常存储在ObjectContext中。在EF 4中,您可以选择使用所谓的“自我跟踪”实体或代理,它们的行为更符合您的预期。但我认为,默认情况下仍然会像EF 1一样。如果查看生成的EDMX文件的C#代码,您将看到属性更改通知的工作原理。

答案 1 :(得分:0)

您可以在实体上实现IEditableObject。

有关示例,请参阅here