Skip to content

Instantly share code, notes, and snippets.

@choudeshell
Created February 21, 2013 16:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save choudeshell/5005986 to your computer and use it in GitHub Desktop.
Save choudeshell/5005986 to your computer and use it in GitHub Desktop.
Entity Framework Insert/Update Trace Extension
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