//---------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.Common;
using System.Diagnostics;
namespace System.Data.EntityClient
{
using Metadata.Edm;
///
/// Class representing a transaction for the conceptual layer
///
public sealed class EntityTransaction : DbTransaction
{
private EntityConnection _connection;
private DbTransaction _storeTransaction;
///
/// Constructs the EntityTransaction object with an associated connection and the underlying store transaction
///
/// The EntityConnetion object owning this transaction
/// The underlying transaction object
internal EntityTransaction(EntityConnection connection, DbTransaction storeTransaction)
: base()
{
Debug.Assert(connection != null && storeTransaction != null);
this._connection = connection;
this._storeTransaction = storeTransaction;
}
///
/// The connection object owning this transaction object
///
public new EntityConnection Connection
{
get
{ // follow the store transaction behavior
return ((null != _storeTransaction.Connection) ? _connection : null);
}
}
///
/// The connection object owning this transaction object
///
protected override DbConnection DbConnection
{
get
{ // follow the store transaction behavior
return ((null != _storeTransaction.Connection) ? _connection : null);
}
}
///
/// The isolation level of this transaction
///
public override IsolationLevel IsolationLevel
{
get
{
return this._storeTransaction.IsolationLevel;
}
}
///
/// Gets the DbTransaction for the underlying provider transaction
///
internal DbTransaction StoreTransaction
{
get
{
return this._storeTransaction;
}
}
///
/// Commits the transaction
///
public override void Commit()
{
try
{
this._storeTransaction.Commit();
}
catch (Exception e)
{
if (EntityUtil.IsCatchableExceptionType(e))
{
throw EntityUtil.Provider(@"Commit", e);
}
throw;
}
this.ClearCurrentTransaction();
}
///
/// Rolls back the transaction
///
public override void Rollback()
{
try
{
this._storeTransaction.Rollback();
}
catch (Exception e)
{
if (EntityUtil.IsCatchableExceptionType(e))
{
throw EntityUtil.Provider(@"Rollback", e);
}
throw;
}
this.ClearCurrentTransaction();
}
///
/// Cleans up this transaction object
///
/// true to release both managed and unmanaged resources; false to release only unmanaged resources
protected override void Dispose(bool disposing)
{
if (disposing)
{
this.ClearCurrentTransaction();
this._storeTransaction.Dispose();
}
base.Dispose(disposing);
}
///
/// Helper method to wrap EntityConnection.ClearCurrentTransaction()
///
private void ClearCurrentTransaction()
{
if (_connection.CurrentTransaction == this)
{
_connection.ClearCurrentTransaction();
}
}
}
}