Created
February 21, 2013 16:34
-
-
Save choudeshell/5005986 to your computer and use it in GitHub Desktop.
Entity Framework Insert/Update Trace Extension
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
namespace EnergyCAP.EF.Extensions | |
{ | |
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
using System.Reflection; | |
using System.Data.Objects; | |
using System.Data.Common; | |
using System.Data.EntityClient; | |
using System.Collections; | |
using System.Data.Entity; | |
using System.Data.Entity.Infrastructure; | |
namespace EntityExtensionMethods | |
{ | |
public static class CustomExtensions | |
{ | |
private static readonly string entityAssemblyName = | |
"system.data.entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; | |
public static string ToTraceString(this IQueryable query) | |
{ | |
System.Reflection.MethodInfo toTraceStringMethod = query.GetType().GetMethod("ToTraceString"); | |
if (toTraceStringMethod != null) | |
return toTraceStringMethod.Invoke(query, null).ToString(); | |
else | |
return ""; | |
} | |
public static string ToTraceString(this DbContext dbContext) | |
{ | |
return ((IObjectContextAdapter)dbContext).ObjectContext.ToTraceString(); | |
} | |
public static string ToTraceString(this ObjectContext ctx) | |
{ | |
Assembly entityAssemly = Assembly.Load(entityAssemblyName); | |
Type updateTranslatorType = entityAssemly.GetType( | |
"System.Data.Mapping.Update.Internal.UpdateTranslator"); | |
Type functionUpdateCommandType = entityAssemly.GetType( | |
"System.Data.Mapping.Update.Internal.FunctionUpdateCommand"); | |
Type dynamicUpdateCommandType = entityAssemly.GetType( | |
"System.Data.Mapping.Update.Internal.DynamicUpdateCommand"); | |
object[] ctorParams = new object[] | |
{ | |
ctx.ObjectStateManager, | |
((EntityConnection)ctx.Connection).GetMetadataWorkspace(), | |
(EntityConnection)ctx.Connection, | |
ctx.CommandTimeout | |
}; | |
object updateTranslator = Activator.CreateInstance(updateTranslatorType, | |
BindingFlags.NonPublic | BindingFlags.Instance, null, ctorParams, null); | |
MethodInfo produceCommandsMethod = updateTranslatorType | |
.GetMethod("ProduceCommands", BindingFlags.Instance | BindingFlags.NonPublic); | |
object updateCommands = produceCommandsMethod.Invoke(updateTranslator, null); | |
List<DbCommand> dbCommands = new List<DbCommand>(); | |
foreach (object o in (IEnumerable)updateCommands) | |
{ | |
if (functionUpdateCommandType.IsInstanceOfType(o)) | |
{ | |
FieldInfo m_dbCommandField = functionUpdateCommandType.GetField( | |
"m_dbCommand", BindingFlags.Instance | BindingFlags.NonPublic); | |
dbCommands.Add((DbCommand)m_dbCommandField.GetValue(o)); | |
} | |
else if (dynamicUpdateCommandType.IsInstanceOfType(o)) | |
{ | |
MethodInfo createCommandMethod = dynamicUpdateCommandType.GetMethod( | |
"CreateCommand", BindingFlags.Instance | BindingFlags.NonPublic); | |
object[] methodParams = new object[] | |
{ | |
updateTranslator, | |
new Dictionary<long, object>() | |
}; | |
dbCommands.Add((DbCommand)createCommandMethod.Invoke(o, methodParams)); | |
} | |
else | |
{ | |
throw new NotSupportedException("Unknown UpdateCommand Kind"); | |
} | |
} | |
StringBuilder traceString = new StringBuilder(); | |
foreach (DbCommand command in dbCommands) | |
{ | |
traceString.AppendLine("=============== BEGIN COMMAND ==============="); | |
traceString.AppendLine(); | |
traceString.AppendLine(command.CommandText); | |
foreach (DbParameter param in command.Parameters) | |
{ | |
traceString.AppendFormat("{0} = {1}", param.ParameterName, param.Value); | |
traceString.AppendLine(); | |
} | |
traceString.AppendLine(); | |
traceString.AppendLine("=============== END COMMAND ==============="); | |
} | |
return traceString.ToString(); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment