实体框架6.1中的事务范围回滚
本文关键字:事务 范围 框架 实体 | 更新日期: 2023-09-27 18:06:17
我有一个问题与TransactionScope
回滚。
当回滚上下文(changetracker)中对象的TransactionScope
状态时,从add更改为modify
private xType _x
{
get;
set
}
public void add(x: xtype)
{
context.xlist.add(x);
}
public xclass: object
{
public xclass()
{
_x = new xtype();
add(_x);
}
public void savechanges;
{
using(transactionscope = new transactionscope())
{
try
{
context.savechanges();
x = 0;
x = x / x;
transcope.complete();
} catch
{
transcope.rollback();
}
}
}
项目使用。net 4.0, vs 2013, ef 6.1, SQL Server 2008 Express,并使用UnitOfWork,存储库模式
您正在修改保存后的对象。这使得它们被修改。
当事务回滚时,EF没有做任何特别的事情。它的内部状态都没有改变。实体对象不会回退。最好的模式是在回滚之后放弃EF上下文。
不需要显式回滚。删除catch。现在,它所做的一切就是吞下所有的错误。
请不要这样使用transactionscope。事务范围是一个范围。您应该在创建事务范围的using子句中对数据库执行一些操作。人们经常做的是,在应用更改之后,通过调用commit方法提交它们。如果发生崩溃,则不会提交任何内容,事务作用域知道到目前为止的更改需要回滚。事务范围可用于实现"工作单元"设计模式。使用子句中的事物被认为是一个工作单元。这些都应该做(或者根本不做)。因此,在调用commit之前发生崩溃时,需要进行某种回滚。几乎完全完成的事情是不被接受的,因为它是一个工作单元。
下面是一些解释基本概念的代码示例。https://msdn.microsoft.com/en-us/library/system.transactions.transactionscope (v = vs.110) . aspx
下面是更多的例子:http://www.codeproject.com/Articles/690136/All-About-TransactionScope