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

Entity framework 使用实体框架进行事务性(内存中)编辑,entity-framework,.net-3.5,Entity Framework,.net 3.5,在以前的数据集和相关对象中,数据对象DataRow和DataRowView的内存表示形式支持通过BeginEdit、EndEdit和CancelEdit进行事务性编辑。将两者都放在适当的位置不仅仅是能够撤消对对象所做的更改并将其恢复为检索到的或未初始化的值;DataRowView对象允许开发人员在任何状态下对DataRow开始单个编辑操作,并撤消这些更改,而不撤消可能已进行的其他更改 比如说, 数据行检索为: Col1 | Col2 ---------------- 1 2

在以前的数据集和相关对象中,数据对象DataRow和DataRowView的内存表示形式支持通过BeginEdit、EndEdit和CancelEdit进行事务性编辑。将两者都放在适当的位置不仅仅是能够撤消对对象所做的更改并将其恢复为检索到的或未初始化的值;DataRowView对象允许开发人员在任何状态下对DataRow开始单个编辑操作,并撤消这些更改,而不撤消可能已进行的其他更改

比如说,

数据行检索为:

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

Col1    | Col2
----------------
1         3
Col1    | Col2
----------------
2         3
BeginEdit调用了此行的DataRowView对象

DataRowView修改为:

Col1    | Col2
----------------
1         3
Col1    | Col2
----------------
2         3
在DataRowView上调用CancelEdit,将值还原为

Col1    | Col2
----------------
1         3
因此,更改被撤消,但在编辑之前存在的值(即使它们在内存中)会发生更改,而不会保留检索到的值


实体框架中是否有类似的设施?考虑到实体似乎对列值使用简单的支持变量,而不是像DataRow或WPF的DependencyProperty infrastructure那样使用属性包方法,我暗自怀疑答案是否定的。

使用实体框架进行事务有两种方法,取决于您需要的事务支持的深度

正确的方法是使用实例。实体框架支持这一点。这种方法的缺点是您现在处于分布式事务中,这对您的计算机和数据库服务器之间的连接具有安全影响。 简单的方法是使用参数SaveChanges。这允许您在调用SaveChanges后保留更改跟踪信息,并接受保存到DB的更改,稍后再处理更改跟踪信息。
关于问题最后一段中的推测:在EF 1中,更改跟踪信息通常存储在ObjectContext中。在EF4中,您可以选择使用所谓的自跟踪实体或代理,它们的行为更符合您的期望。但我认为,默认的做法仍然是表现得像EF1。如果查看为EDMX文件生成的C代码,您将看到属性更改通知是如何工作的。

您可以在实体上实现IEditableObject


请参阅以获取示例。

除非我误解了您的答案,而且这完全有可能,否则听起来您在谈论事务性数据库操作。虽然这显然很重要,但这不是我的目的。我所说的都是客户端。有关更好的解释,请参阅IEditableObject和ICancelEdit的DataRow和DataRowView实现。不,我指的是分布式事务,包括但不限于数据库事务。阅读我为TransactionScope提供的链接。没错,TransactionScope对象可以用于数据库操作以外的操作,但我认为它不适用于这种情况。同样,我所说的是对属性值的内存更改。我不认为TransactionScope会对这些人产生任何影响,除非有一些我不知道的严重的魔法在发生。你个人是否出于好奇而使用过这个?我对PostSharp的解决方案有点担心……我从来没有完全习惯于将声明式编程提升到那个水平,但我可能有点暴躁。手工实现它非常简单。我会先试试。