Esempio n. 1
0
        public async Task <SaveResult> SaveChangesAsync(JObject saveBundle, TransactionSettings transactionSettings = null)
        {
            if (SaveWorkState == null || SaveWorkState.WasUsed)
            {
                InitializeSaveState(saveBundle);
            }

            transactionSettings = transactionSettings ?? BreezeConfig.Instance.GetTransactionSettings();
            try {
                if (transactionSettings.TransactionType == TransactionType.TransactionScope)
                {
                    var txOptions = transactionSettings.ToTransactionOptions();
                    using (var txScope = new TransactionScope(TransactionScopeOption.Required, txOptions)) {
                        await OpenAndSaveAsync(SaveWorkState);

                        txScope.Complete();
                    }
                }
                else if (transactionSettings.TransactionType == TransactionType.DbTransaction)
                {
                    this.OpenDbConnection();
                    using (IDbTransaction tran = BeginTransaction(transactionSettings.IsolationLevelAs)) {
                        try {
                            await OpenAndSaveAsync(SaveWorkState);

                            await session.Transaction.CommitAsync();
                        } catch {
                            session.Transaction.Rollback();
                            throw;
                        }
                    }
                }
                else
                {
                    await OpenAndSaveAsync(SaveWorkState);
                }
            } catch (EntityErrorsException e) {
                SaveWorkState.EntityErrors = e.EntityErrors;
                throw;
            } catch (Exception e2) {
                if (!HandleSaveException(e2, SaveWorkState))
                {
                    throw;
                }
            } finally {
                CloseDbConnection();
            }

            return(SaveWorkState.ToSaveResult());
        }