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