实体框架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,存储库模式

实体框架6.1中的事务范围回滚

您正在修改保存后的对象。这使得它们被修改。

当事务回滚时,

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