TransactionScope 与 Entity Framwork 一起如何使用?

        public void InsertMasterController(MasterController masterController)
        {
            try
            {
                if (masterController == null)
                {
                    throw new DomainException(TextResource.ERROR_ARGUMENT_CAN_NOT_NULL);
                }

                if (masterController.Id == null || masterController.Id == Guid.Empty)
                {
                    masterController.Id = Guid.NewGuid();
                    masterController.LastState = (short)UnifiedSecurityDefine.LastStateType.Create;
                    masterController.IsConnected = false;
                    masterController.CreatedBy = masterController.CreatedBy;
                    masterController.CreatedOn = DateTime.Now;
                    masterController.ModifyBy = masterController.ModifyBy;
                    masterController.ModifyOn = DateTime.Now;
                    masterController.IsConnected = false;
                    masterController.CheckTempSW = true;
                    masterController.IsEnabled = true;
                    masterController.Password = "1234";
                }

                using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
                {
                    masterController.ServerNetworkId = InsertServerNetwork();

                    if ((masterController.EntityState != EntityState.Detached))
                    {
                        this.ObjectContext.ObjectStateManager.ChangeObjectState(masterController, EntityState.Added);
                    }
                    else
                    {
                        this.ObjectContext.SecurityObjects.AddObject(masterController);
                    }

                    ISecurityObjectProvider provider = null;

                    provider = GetSecurityObjectProvider(masterController.ProductCode);

                    if (provider == null)
                    {

                        throw new DomainException(TextResource.ERROR_PROVIDER_NULL);
                    }
                    EntityInfo entityInfo = new EntityInfo();
                    entityInfo.controllerId = masterController.Id;
                    entityInfo.context = this.ObjectContext;
                    entityInfo.userId = masterController.CreatedBy;
                    entityInfo.no = masterController.No;
                    provider.AddChildSecurityObjects(entityInfo);

                    ts.Complete();
                }
            }
            catch (Exception ex)
            {
                log.SetLogFile(TextResource.LOG_FOLDER_NAME_EXCEPTION, ex.Message + ex.StackTrace, 1);
                throw new DomainException(TextResource.ERROR_MASTER_CONTROLLER_INSERT, ex);
            }
        }


TransactionScopeOption 枚举

TransactionScopeOption 枚举

成员


成员名称说明
 Required该范围需要一个事务。如果已经存在环境事务,则使用该环境事务。否则,在进入范围之前创建新的事务。这是默认值。
 RequiresNew总是为该范围创建新事务。
 Suppress环境事务上下文在创建范围时被取消。范围中的所有操作都在无环境事务上下文的情况下完成。

TransactionScopeOption 枚举被传递给 TransactionScope 类的各个构造函数,以定义范围的事务性行为。有关如何使用此枚举的更多信息,请参阅 Implementing An Implicit Transaction Using Transaction Scope 中的“Managing Transaction Flow using TransactionScopeOption”(使用 TransactionScopeOption 管理事务流)部分。

 

 

 

System.Transactions 基础结构既提供了基于Transaction 类的显式编程模型,也提供了使用TransactionScope 类的隐式编程模型,在后一种模型中,事务由该基础结构自动管理。

重要说明重要事项

建议使用 TransactionScope 类创建隐式事务,以便自动为您管理环境事务上下文。对于需要跨多个函数调用或多个线程调用使用相同事务的应用程序,您还应该使用TransactionScopeDependentTransaction 类。有关此模型的更多信息,请参见Implementing An Implicit Transaction Using Transaction Scope 主题。有关编写事务性应用程序的更多信息,请参见Writing A Transactional Application

在实例化 TransactionScope 后(通过new 语句),事务管理器确定哪些事务参与进来。一旦确定,该范围将始终参与该事务。此决策基于两个因素:是否存在环境事务以及构造函数中TransactionScopeOption 参数的值。您的代码是在环境事务中执行的。可通过调用Transaction 类的静态Current 属性获取对环境事务的引用。有关如何使用此参数的更多信息,请参见Implementing An Implicit Transaction Using Transaction Scope 主题的“事务流管理”一节。

如果在事务范围中(即从初始化 TransactionScope 对象到调用其Dispose 方法之间)未发生异常,则允许该范围所参与的事务继续。如果事务范围中的确发生了异常,它所参与的事务将回滚。

当应用程序完成它要在一个事务中执行的所有工作以后,您应当只调用 Complete 方法一次,以通知事务管理器可以接受提交事务。未能调用此方法将中止该事务。

Dispose 方法的调用标志着该事务范围的结束。在调用此方法之后发生的异常不会影响该事务。

如果在范围中修改 Current 的值,则会在调用Dispose 时引发异常。但是,在该范围结束时,先前的值将被还原。此外,如果在创建事务的事务范围内对Current 调用Dispose,则该事务将在相应范围末尾处中止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值