/*
Kooboo is a content management system based on ASP.NET MVC framework. Copyright 2009 Yardi Technology Limited.
This program is free software: you can redistribute it and/or modify it under the terms of the
GNU General Public License version 3 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program.
If not, see http://www.kooboo.com/gpl3/.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
using System.Data.Objects;
using System.Data.EntityClient;
using Everest.Library.Reflection;
using EFProviderWrapperToolkit;
using System.Reflection;
namespace Everest.CmsServices.Models{
public static class ObjectContextExtensions
{
static PropertyInfo currentTransactionProperty = typeof(EntityConnection).GetProperty("CurrentTransaction", BindingFlags.Instance | BindingFlags.NonPublic);
static PropertyInfo storeTransactionProperty = typeof(EntityTransaction).GetProperty("StoreTransaction", BindingFlags.Instance | BindingFlags.NonPublic);
public static DbTransaction GetCurrentStoreTransaction(this ObjectContext objectContext)
{
if (objectContext.Connection.State == System.Data.ConnectionState.Open)
{
EntityConnection entityConnection = (EntityConnection)objectContext.Connection;
//can not run on medium-trust level.
//var connectionGetter = PropertyDelegateFactory.GetPropertyGetter(typeof(EntityConnection), "CurrentTransaction");
//EntityTransaction entityTransaction = connectionGetter.Invoke(entityConnection) as EntityTransaction;
var entityTransaction = currentTransactionProperty.GetValue(entityConnection, new object[0]);
if (entityTransaction != null)
{
// var transactionGetter = PropertyDelegateFactory.GetPropertyGetter(typeof(EntityTransaction), "StoreTransaction");
//DbTransaction transaction = (DbTransaction)transactionGetter.Invoke(entityTransaction);
var transaction = (DbTransaction)storeTransactionProperty.GetValue(entityTransaction, new object[0]);
if (transaction is DbTransactionWrapper)
{
return ((DbTransactionWrapper)transaction).WrappedTransaction;
}
else
return transaction;
}
}
return null;
}
}
}
|