public static class Link
2{
3 static Assembly efAssembly = typeof(EntityCommand).Assembly;
4
5 public static string ToTraceString(this IQueryable query)
6 {
7 MethodInfo method = query.GetType().
8 GetMethod("ToTraceString");
9
10 if (method != null)
11 return method.Invoke(query, null).ToString();
12 else return "";
13 }
14
15 public static string ToTraceString(this ObjectContext context)
16 {
17 string intern = "System.Data.Mapping.Update.Internal";
18
19 Type dynUpdate = efAssembly.GetType(intern + ".DynamicUpdateCommand");
20 Type updTranslate = efAssembly.GetType(intern + ".UpdateTranslator");
21 Type funcUpdate = efAssembly.GetType(intern + ".FunctionUpdateCommand");
22
23 EntityConnection conn = context.Connection as EntityConnection;
24 object[] parameter = new object[]
25 {
26 context.ObjectStateManager,
27 conn.GetMetadataWorkspace(),
28 conn, context.CommandTimeout
29 };
30
31 BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
32 object updTranslator = Activator.CreateInstance(updTranslate,flags, null, parameter, null);
33 MethodInfo prodCommands = updTranslate.GetMethod("ProduceCommands", flags);
34 object updateCommands = prodCommands.Invoke(updTranslator, null);
35 List<DbCommand> dbCommands = new List<DbCommand>();
36
37 foreach (object obj in (IEnumerable)updateCommands)
38 {
39 if (funcUpdate.IsInstanceOfType(obj))
40 {
41 FieldInfo dbCommand = funcUpdate.
42 GetField("m_dbCommand", flags);
43 dbCommands.Add((DbCommand)dbCommand.GetValue(obj));
44 }
45 else if (dynUpdate.IsInstanceOfType(obj))
46 {
47 MethodInfo createCommand = dynUpdate.
48 GetMethod("CreateCommand", flags);
49 object[] mParams = new object[] { updTranslator, new Dictionary<long, object>() };
50 dbCommands.Add((DbCommand)createCommand.Invoke(obj, mParams));
51 }
52 else
53 throw new NotImplementedException("Unbekannter Update-Kommandotyp");
54 }
55
56 StringBuilder ts = new StringBuilder();
57 foreach (DbCommand cmd in dbCommands)
58 {
59 ts.AppendLine("\r\n****** Kommand Beginn ******");
60 ts.AppendLine(cmd.CommandText);
61 ts.AppendLine("*** Parameterwerte ***:");
62 foreach (DbParameter p in cmd.Parameters)
63 ts.AppendFormat("{0} = {1}\r\n", p.ParameterName, p.Value);
64 ts.AppendLine("****** Kommand Ende *********\r\n");
65 }
66
67 return ts.ToString();
68 }
69}