Skip to content

Commit 012de82

Browse files
committed
Include command tree interceptor values in GetCommandTextAndParameters().
When these values are not included, incorrect cache keys can be generated. For example, the cached value will be used when the tree interceptor uses a different value.
1 parent 1caf48c commit 012de82

File tree

5 files changed

+50
-0
lines changed

5 files changed

+50
-0
lines changed

src/Z.EntityFramework.Plus.EF5.NET40/_Internal/EF6/ObjectQuery/GetCommandTextAndParameters.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
#if FULL || QUERY_CACHE || QUERY_FILTER
99
#if EF6
1010
using System;
11+
using System.Collections.Generic;
1112
using System.Data.Common;
1213
using System.Data.Entity.Core.EntityClient;
1314
using System.Data.Entity.Core.Objects;
15+
using System.Data.Entity.Infrastructure.Interception;
1416
using System.Reflection;
1517

1618
namespace Z.EntityFramework.Plus
@@ -34,6 +36,14 @@ public static Tuple<string, DbParameterCollection> GetCommandTextAndParameters(t
3436
var prepareEntityCommandBeforeExecutionMethod = getCommandDefinition.GetType().GetMethod("PrepareEntityCommandBeforeExecution", BindingFlags.NonPublic | BindingFlags.Instance);
3537
var prepareEntityCommandBeforeExecution = (DbCommand) prepareEntityCommandBeforeExecutionMethod.Invoke(getCommandDefinition, new object[] {entityCommand});
3638

39+
var commandDispatcherField = DbInterception.Dispatch.Command.GetType().GetField("_internalDispatcher", BindingFlags.Instance | BindingFlags.NonPublic);
40+
var commandDispatcher = commandDispatcherField.GetValue(DbInterception.Dispatch.Command);
41+
42+
var interceptorsField = commandDispatcher.GetType().GetField("_interceptors", BindingFlags.Instance | BindingFlags.NonPublic);
43+
var interceptors = (List<IDbCommandInterceptor>) interceptorsField.GetValue(commandDispatcher);
44+
45+
interceptors.ForEach(i => i.ReaderExecuting(prepareEntityCommandBeforeExecution, new DbCommandInterceptionContext<DbDataReader>(objectQuery.Context.GetInterceptionContext())));
46+
3747
sql = prepareEntityCommandBeforeExecution.CommandText;
3848
var parameters = prepareEntityCommandBeforeExecution.Parameters;
3949

src/Z.EntityFramework.Plus.EF5/_Internal/EF6/ObjectQuery/GetCommandTextAndParameters.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
#if FULL || QUERY_CACHE || QUERY_FILTER
99
#if EF6
1010
using System;
11+
using System.Collections.Generic;
1112
using System.Data.Common;
1213
using System.Data.Entity.Core.EntityClient;
1314
using System.Data.Entity.Core.Objects;
15+
using System.Data.Entity.Infrastructure.Interception;
1416
using System.Reflection;
1517

1618
namespace Z.EntityFramework.Plus
@@ -34,6 +36,14 @@ public static Tuple<string, DbParameterCollection> GetCommandTextAndParameters(t
3436
var prepareEntityCommandBeforeExecutionMethod = getCommandDefinition.GetType().GetMethod("PrepareEntityCommandBeforeExecution", BindingFlags.NonPublic | BindingFlags.Instance);
3537
var prepareEntityCommandBeforeExecution = (DbCommand) prepareEntityCommandBeforeExecutionMethod.Invoke(getCommandDefinition, new object[] {entityCommand});
3638

39+
var commandDispatcherField = DbInterception.Dispatch.Command.GetType().GetField("_internalDispatcher", BindingFlags.Instance | BindingFlags.NonPublic);
40+
var commandDispatcher = commandDispatcherField.GetValue(DbInterception.Dispatch.Command);
41+
42+
var interceptorsField = commandDispatcher.GetType().GetField("_interceptors", BindingFlags.Instance | BindingFlags.NonPublic);
43+
var interceptors = (List<IDbCommandInterceptor>) interceptorsField.GetValue(commandDispatcher);
44+
45+
interceptors.ForEach(i => i.ReaderExecuting(prepareEntityCommandBeforeExecution, new DbCommandInterceptionContext<DbDataReader>(objectQuery.Context.GetInterceptionContext())));
46+
3747
sql = prepareEntityCommandBeforeExecution.CommandText;
3848
var parameters = prepareEntityCommandBeforeExecution.Parameters;
3949

src/Z.EntityFramework.Plus.EF6.NET40/_Internal/EF6/ObjectQuery/GetCommandTextAndParameters.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
#if FULL || QUERY_CACHE || QUERY_FILTER
99
#if EF6
1010
using System;
11+
using System.Collections.Generic;
1112
using System.Data.Common;
1213
using System.Data.Entity.Core.EntityClient;
1314
using System.Data.Entity.Core.Objects;
15+
using System.Data.Entity.Infrastructure.Interception;
1416
using System.Reflection;
1517

1618
namespace Z.EntityFramework.Plus
@@ -34,6 +36,14 @@ public static Tuple<string, DbParameterCollection> GetCommandTextAndParameters(t
3436
var prepareEntityCommandBeforeExecutionMethod = getCommandDefinition.GetType().GetMethod("PrepareEntityCommandBeforeExecution", BindingFlags.NonPublic | BindingFlags.Instance);
3537
var prepareEntityCommandBeforeExecution = (DbCommand) prepareEntityCommandBeforeExecutionMethod.Invoke(getCommandDefinition, new object[] {entityCommand});
3638

39+
var commandDispatcherField = DbInterception.Dispatch.Command.GetType().GetField("_internalDispatcher", BindingFlags.Instance | BindingFlags.NonPublic);
40+
var commandDispatcher = commandDispatcherField.GetValue(DbInterception.Dispatch.Command);
41+
42+
var interceptorsField = commandDispatcher.GetType().GetField("_interceptors", BindingFlags.Instance | BindingFlags.NonPublic);
43+
var interceptors = (List<IDbCommandInterceptor>) interceptorsField.GetValue(commandDispatcher);
44+
45+
interceptors.ForEach(i => i.ReaderExecuting(prepareEntityCommandBeforeExecution, new DbCommandInterceptionContext<DbDataReader>(objectQuery.Context.GetInterceptionContext())));
46+
3747
sql = prepareEntityCommandBeforeExecution.CommandText;
3848
var parameters = prepareEntityCommandBeforeExecution.Parameters;
3949

src/Z.EntityFramework.Plus.EF6/_Internal/EF6/ObjectQuery/GetCommandTextAndParameters.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
#if FULL || QUERY_CACHE || QUERY_FILTER
99
#if EF6
1010
using System;
11+
using System.Collections.Generic;
1112
using System.Data.Common;
1213
using System.Data.Entity.Core.EntityClient;
1314
using System.Data.Entity.Core.Objects;
15+
using System.Data.Entity.Infrastructure.Interception;
1416
using System.Reflection;
1517

1618
namespace Z.EntityFramework.Plus
@@ -34,6 +36,14 @@ public static Tuple<string, DbParameterCollection> GetCommandTextAndParameters(t
3436
var prepareEntityCommandBeforeExecutionMethod = getCommandDefinition.GetType().GetMethod("PrepareEntityCommandBeforeExecution", BindingFlags.NonPublic | BindingFlags.Instance);
3537
var prepareEntityCommandBeforeExecution = (DbCommand) prepareEntityCommandBeforeExecutionMethod.Invoke(getCommandDefinition, new object[] {entityCommand});
3638

39+
var commandDispatcherField = DbInterception.Dispatch.Command.GetType().GetField("_internalDispatcher", BindingFlags.Instance | BindingFlags.NonPublic);
40+
var commandDispatcher = commandDispatcherField.GetValue(DbInterception.Dispatch.Command);
41+
42+
var interceptorsField = commandDispatcher.GetType().GetField("_interceptors", BindingFlags.Instance | BindingFlags.NonPublic);
43+
var interceptors = (List<IDbCommandInterceptor>) interceptorsField.GetValue(commandDispatcher);
44+
45+
interceptors.ForEach(i => i.ReaderExecuting(prepareEntityCommandBeforeExecution, new DbCommandInterceptionContext<DbDataReader>(objectQuery.Context.GetInterceptionContext())));
46+
3747
sql = prepareEntityCommandBeforeExecution.CommandText;
3848
var parameters = prepareEntityCommandBeforeExecution.Parameters;
3949

src/Z.EntityFramework.Plus.EFCore/_Internal/EF6/ObjectQuery/GetCommandTextAndParameters.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
#if FULL || QUERY_CACHE || QUERY_FILTER
99
#if EF6
1010
using System;
11+
using System.Collections.Generic;
1112
using System.Data.Common;
1213
using System.Data.Entity.Core.EntityClient;
1314
using System.Data.Entity.Core.Objects;
15+
using System.Data.Entity.Infrastructure.Interception;
1416
using System.Reflection;
1517

1618
namespace Z.EntityFramework.Plus
@@ -34,6 +36,14 @@ public static Tuple<string, DbParameterCollection> GetCommandTextAndParameters(t
3436
var prepareEntityCommandBeforeExecutionMethod = getCommandDefinition.GetType().GetMethod("PrepareEntityCommandBeforeExecution", BindingFlags.NonPublic | BindingFlags.Instance);
3537
var prepareEntityCommandBeforeExecution = (DbCommand) prepareEntityCommandBeforeExecutionMethod.Invoke(getCommandDefinition, new object[] {entityCommand});
3638

39+
var commandDispatcherField = DbInterception.Dispatch.Command.GetType().GetField("_internalDispatcher", BindingFlags.Instance | BindingFlags.NonPublic);
40+
var commandDispatcher = commandDispatcherField.GetValue(DbInterception.Dispatch.Command);
41+
42+
var interceptorsField = commandDispatcher.GetType().GetField("_interceptors", BindingFlags.Instance | BindingFlags.NonPublic);
43+
var interceptors = (List<IDbCommandInterceptor>) interceptorsField.GetValue(commandDispatcher);
44+
45+
interceptors.ForEach(i => i.ReaderExecuting(prepareEntityCommandBeforeExecution, new DbCommandInterceptionContext<DbDataReader>(objectQuery.Context.GetInterceptionContext())));
46+
3747
sql = prepareEntityCommandBeforeExecution.CommandText;
3848
var parameters = prepareEntityCommandBeforeExecution.Parameters;
3949

0 commit comments

Comments
 (0)