Skip to content

Commit 423498a

Browse files
author
zzzprojects
committed
ADD Query Cache connection string
ADD Query Cache connection string
1 parent df8e21f commit 423498a

File tree

23 files changed

+614
-107
lines changed

23 files changed

+614
-107
lines changed

src/Z.EntityFramework.Plus.EF5.NET40/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@
1818
[assembly: AssemblyCulture("")]
1919
[assembly: ComVisible(false)]
2020
[assembly: Guid("e4c2af73-caeb-4429-bcb6-0a359484e064")]
21-
[assembly: AssemblyVersion("1.3.4")]
22-
[assembly: AssemblyFileVersion("1.3.4")]
21+
[assembly: AssemblyVersion("1.3.5")]
22+
[assembly: AssemblyFileVersion("1.3.5")]

src/Z.EntityFramework.Plus.EF5.NET40/QueryCache/QueryCacheManager.cs

Lines changed: 67 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,16 @@
88
using System.Collections.Concurrent;
99
using System.Collections.Generic;
1010
using System.Data.Common;
11+
using System.Data.SqlClient;
1112
using System.Linq;
1213
using System.Text;
13-
#if EF5 || EF6
14+
15+
#if EF5
16+
using System.Runtime.Caching;
17+
using System.Data.EntityClient;
18+
19+
#elif EF6
20+
using System.Data.Entity.Core.EntityClient;
1421
using System.Runtime.Caching;
1522

1623
#elif EFCORE
@@ -37,6 +44,7 @@ static QueryCacheManager()
3744
#endif
3845
CachePrefix = "Z.EntityFramework.Plus.QueryCacheManager;";
3946
CacheTags = new ConcurrentDictionary<string, List<string>>();
47+
IncludeConnectionInCacheKey = true;
4048
}
4149

4250
#if EF5 || EF6
@@ -61,6 +69,12 @@ static QueryCacheManager()
6169
/// <value>The cache prefix to use to create the cache key.</value>
6270
public static string CachePrefix { get; set; }
6371

72+
/// <summary>
73+
/// Gets or sets a value indicating whether the connection in cache key should be included.
74+
/// </summary>
75+
/// <value>true if include connection in cache key, false if not.</value>
76+
public static bool IncludeConnectionInCacheKey { get; set; }
77+
6478
/// <summary>Gets the dictionary cache tags used to store tags and corresponding cached keys.</summary>
6579
/// <value>The cache tags used to store tags and corresponding cached keys.</value>
6680
public static ConcurrentDictionary<string, List<string>> CacheTags { get; }
@@ -112,12 +126,25 @@ public static string GetCacheKey(IQueryable query, string[] tags)
112126
{
113127
var sb = new StringBuilder();
114128

115-
#if EF5
129+
#if EF5 || EF6
116130
var objectQuery = query.GetObjectQuery();
117131

118132
sb.AppendLine(CachePrefix);
119-
sb.AppendLine(objectQuery.Context.Connection.ConnectionString);
133+
134+
if (IncludeConnectionInCacheKey)
135+
{
136+
var connection = ((EntityConnection)objectQuery.Context.Connection).GetStoreConnection();
137+
138+
// FORCE database name in case "ChangeDatabase()" method is used
139+
sb.AppendLine(connection.DataSource ?? "");
140+
sb.AppendLine(connection.Database ?? "");
141+
sb.AppendLine(connection.ConnectionString);
142+
}
143+
120144
sb.AppendLine(string.Join(";", tags));
145+
#endif
146+
147+
#if EF5
121148
sb.AppendLine(objectQuery.ToTraceString());
122149

123150
foreach (var parameter in objectQuery.Parameters)
@@ -128,12 +155,6 @@ public static string GetCacheKey(IQueryable query, string[] tags)
128155
sb.AppendLine(";");
129156
}
130157
#elif EF6
131-
var objectQuery = query.GetObjectQuery();
132-
133-
sb.AppendLine(CachePrefix);
134-
sb.AppendLine(objectQuery.Context.Connection.ConnectionString);
135-
sb.AppendLine(string.Join(";", tags));
136-
137158
var commandTextAndParameters = objectQuery.GetCommandTextAndParameters();
138159
sb.AppendLine(commandTextAndParameters.Item1);
139160

@@ -149,7 +170,17 @@ public static string GetCacheKey(IQueryable query, string[] tags)
149170
var command = query.CreateCommand(out queryContext);
150171

151172
sb.AppendLine(CachePrefix);
152-
sb.AppendLine(queryContext.Connection.ConnectionString);
173+
174+
if (IncludeConnectionInCacheKey)
175+
{
176+
var connection = queryContext.Connection.DbConnection;
177+
178+
// FORCE database name in case "ChangeDatabase()" method is used
179+
sb.AppendLine(connection.DataSource ?? "");
180+
sb.AppendLine(connection.Database ?? "");
181+
sb.AppendLine(connection.ConnectionString);
182+
}
183+
153184
sb.AppendLine(string.Join(";", tags));
154185
sb.AppendLine(command.CommandText);
155186

@@ -174,12 +205,25 @@ public static string GetCacheKey<T>(QueryDeferred<T> query, string[] tags)
174205
{
175206
var sb = new StringBuilder();
176207

177-
#if EF5
208+
#if EF5 || EF6
178209
var objectQuery = query.Query.GetObjectQuery();
179210

180211
sb.AppendLine(CachePrefix);
181-
sb.AppendLine(objectQuery.Context.Connection.ConnectionString);
212+
213+
if (IncludeConnectionInCacheKey)
214+
{
215+
var connection = ((EntityConnection)objectQuery.Context.Connection).GetStoreConnection();
216+
217+
// FORCE database name in case "ChangeDatabase()" method is used
218+
sb.AppendLine(connection.DataSource ?? "");
219+
sb.AppendLine(connection.Database ?? "");
220+
sb.AppendLine(connection.ConnectionString);
221+
}
222+
182223
sb.AppendLine(string.Join(";", tags));
224+
#endif
225+
226+
#if EF5
183227
sb.AppendLine(objectQuery.ToTraceString());
184228

185229
foreach (var parameter in objectQuery.Parameters)
@@ -190,12 +234,6 @@ public static string GetCacheKey<T>(QueryDeferred<T> query, string[] tags)
190234
sb.AppendLine(";");
191235
}
192236
#elif EF6
193-
var objectQuery = query.Query.GetObjectQuery();
194-
195-
sb.AppendLine(CachePrefix);
196-
sb.AppendLine(objectQuery.Context.Connection.ConnectionString);
197-
sb.AppendLine(string.Join(";", tags));
198-
199237
var commandTextAndParameters = objectQuery.GetCommandTextAndParameters();
200238
sb.AppendLine(commandTextAndParameters.Item1);
201239

@@ -211,7 +249,17 @@ public static string GetCacheKey<T>(QueryDeferred<T> query, string[] tags)
211249
var command = query.Query.CreateCommand(out queryContext);
212250

213251
sb.AppendLine(CachePrefix);
214-
sb.AppendLine(queryContext.Connection.ConnectionString);
252+
253+
if (IncludeConnectionInCacheKey)
254+
{
255+
var connection = queryContext.Connection.DbConnection;
256+
257+
// FORCE database name in case "ChangeDatabase()" method is used
258+
sb.AppendLine(connection.DataSource ?? "");
259+
sb.AppendLine(connection.Database ?? "");
260+
sb.AppendLine(connection.ConnectionString);
261+
}
262+
215263
sb.AppendLine(string.Join(";", tags));
216264
sb.AppendLine(command.CommandText);
217265

src/Z.EntityFramework.Plus.EF5.NET40/Z.EntityFramework.Plus.EF5.NET40.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@
151151
<Compile Include="_Internal\EF5_EF6\DbContext\DbContext.GetObjectContext.cs" />
152152
<Compile Include="_Internal\EF5_EF6\EntityConnection\GetDbTransaction.cs" />
153153
<Compile Include="_Internal\EF5_EF6\EntityConnection\GetEntityTransaction.cs" />
154+
<Compile Include="_Internal\EF5_EF6\EntityConnection\GetStoreConnection.cs" />
154155
<Compile Include="_Internal\EF5_EF6\EntityConnection\GetStoreTransaction.cs" />
155156
<Compile Include="_Internal\EF5_EF6\IDbSet`\GetDbContext.cs" />
156157
<Compile Include="_Internal\EF5_EF6\IQueryable\IQueryable.GetObjectQuery.cs" />
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Description: Entity Framework Bulk Operations & Utilities (EF Bulk SaveChanges, Insert, Update, Delete, Merge | LINQ Query Cache, Deferred, Filter, IncludeFilter, IncludeOptimize | Audit)
2+
// Website & Documentation: https://github.com/zzzprojects/Entity-Framework-Plus
3+
// Forum & Issues: https://github.com/zzzprojects/EntityFramework-Plus/issues
4+
// License: https://github.com/zzzprojects/EntityFramework-Plus/blob/master/LICENSE
5+
// More projects: http://www.zzzprojects.com/
6+
// Copyright © ZZZ Projects Inc. 2014 - 2016. All rights reserved.
7+
8+
#if FULL || QUERY_CACHE
9+
#if EF5 || EF6
10+
using System.Data.Common;
11+
using System.Reflection;
12+
#if EF5
13+
using System.Data.EntityClient;
14+
15+
#elif EF6
16+
using System.Data.Entity.Core.EntityClient;
17+
18+
#endif
19+
20+
namespace Z.EntityFramework.Plus
21+
{
22+
internal static partial class InternalExtensions
23+
{
24+
25+
public static DbConnection GetStoreConnection(this EntityConnection entityConnection)
26+
{
27+
var storeConnectionProperty = entityConnection.GetType().GetProperty("StoreConnection", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
28+
return (DbConnection)storeConnectionProperty.GetValue(entityConnection, null);
29+
}
30+
}
31+
}
32+
33+
#endif
34+
#endif

src/Z.EntityFramework.Plus.EF5/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@
1818
[assembly: AssemblyCulture("")]
1919
[assembly: ComVisible(false)]
2020
[assembly: Guid("abcbb878-043c-4957-a334-90e9872e684e")]
21-
[assembly: AssemblyVersion("1.3.4")]
22-
[assembly: AssemblyFileVersion("1.3.4")]
21+
[assembly: AssemblyVersion("1.3.5")]
22+
[assembly: AssemblyFileVersion("1.3.5")]

src/Z.EntityFramework.Plus.EF5/QueryCache/QueryCacheManager.cs

Lines changed: 67 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,16 @@
88
using System.Collections.Concurrent;
99
using System.Collections.Generic;
1010
using System.Data.Common;
11+
using System.Data.SqlClient;
1112
using System.Linq;
1213
using System.Text;
13-
#if EF5 || EF6
14+
15+
#if EF5
16+
using System.Runtime.Caching;
17+
using System.Data.EntityClient;
18+
19+
#elif EF6
20+
using System.Data.Entity.Core.EntityClient;
1421
using System.Runtime.Caching;
1522

1623
#elif EFCORE
@@ -37,6 +44,7 @@ static QueryCacheManager()
3744
#endif
3845
CachePrefix = "Z.EntityFramework.Plus.QueryCacheManager;";
3946
CacheTags = new ConcurrentDictionary<string, List<string>>();
47+
IncludeConnectionInCacheKey = true;
4048
}
4149

4250
#if EF5 || EF6
@@ -61,6 +69,12 @@ static QueryCacheManager()
6169
/// <value>The cache prefix to use to create the cache key.</value>
6270
public static string CachePrefix { get; set; }
6371

72+
/// <summary>
73+
/// Gets or sets a value indicating whether the connection in cache key should be included.
74+
/// </summary>
75+
/// <value>true if include connection in cache key, false if not.</value>
76+
public static bool IncludeConnectionInCacheKey { get; set; }
77+
6478
/// <summary>Gets the dictionary cache tags used to store tags and corresponding cached keys.</summary>
6579
/// <value>The cache tags used to store tags and corresponding cached keys.</value>
6680
public static ConcurrentDictionary<string, List<string>> CacheTags { get; }
@@ -112,12 +126,25 @@ public static string GetCacheKey(IQueryable query, string[] tags)
112126
{
113127
var sb = new StringBuilder();
114128

115-
#if EF5
129+
#if EF5 || EF6
116130
var objectQuery = query.GetObjectQuery();
117131

118132
sb.AppendLine(CachePrefix);
119-
sb.AppendLine(objectQuery.Context.Connection.ConnectionString);
133+
134+
if (IncludeConnectionInCacheKey)
135+
{
136+
var connection = ((EntityConnection)objectQuery.Context.Connection).GetStoreConnection();
137+
138+
// FORCE database name in case "ChangeDatabase()" method is used
139+
sb.AppendLine(connection.DataSource ?? "");
140+
sb.AppendLine(connection.Database ?? "");
141+
sb.AppendLine(connection.ConnectionString);
142+
}
143+
120144
sb.AppendLine(string.Join(";", tags));
145+
#endif
146+
147+
#if EF5
121148
sb.AppendLine(objectQuery.ToTraceString());
122149

123150
foreach (var parameter in objectQuery.Parameters)
@@ -128,12 +155,6 @@ public static string GetCacheKey(IQueryable query, string[] tags)
128155
sb.AppendLine(";");
129156
}
130157
#elif EF6
131-
var objectQuery = query.GetObjectQuery();
132-
133-
sb.AppendLine(CachePrefix);
134-
sb.AppendLine(objectQuery.Context.Connection.ConnectionString);
135-
sb.AppendLine(string.Join(";", tags));
136-
137158
var commandTextAndParameters = objectQuery.GetCommandTextAndParameters();
138159
sb.AppendLine(commandTextAndParameters.Item1);
139160

@@ -149,7 +170,17 @@ public static string GetCacheKey(IQueryable query, string[] tags)
149170
var command = query.CreateCommand(out queryContext);
150171

151172
sb.AppendLine(CachePrefix);
152-
sb.AppendLine(queryContext.Connection.ConnectionString);
173+
174+
if (IncludeConnectionInCacheKey)
175+
{
176+
var connection = queryContext.Connection.DbConnection;
177+
178+
// FORCE database name in case "ChangeDatabase()" method is used
179+
sb.AppendLine(connection.DataSource ?? "");
180+
sb.AppendLine(connection.Database ?? "");
181+
sb.AppendLine(connection.ConnectionString);
182+
}
183+
153184
sb.AppendLine(string.Join(";", tags));
154185
sb.AppendLine(command.CommandText);
155186

@@ -174,12 +205,25 @@ public static string GetCacheKey<T>(QueryDeferred<T> query, string[] tags)
174205
{
175206
var sb = new StringBuilder();
176207

177-
#if EF5
208+
#if EF5 || EF6
178209
var objectQuery = query.Query.GetObjectQuery();
179210

180211
sb.AppendLine(CachePrefix);
181-
sb.AppendLine(objectQuery.Context.Connection.ConnectionString);
212+
213+
if (IncludeConnectionInCacheKey)
214+
{
215+
var connection = ((EntityConnection)objectQuery.Context.Connection).GetStoreConnection();
216+
217+
// FORCE database name in case "ChangeDatabase()" method is used
218+
sb.AppendLine(connection.DataSource ?? "");
219+
sb.AppendLine(connection.Database ?? "");
220+
sb.AppendLine(connection.ConnectionString);
221+
}
222+
182223
sb.AppendLine(string.Join(";", tags));
224+
#endif
225+
226+
#if EF5
183227
sb.AppendLine(objectQuery.ToTraceString());
184228

185229
foreach (var parameter in objectQuery.Parameters)
@@ -190,12 +234,6 @@ public static string GetCacheKey<T>(QueryDeferred<T> query, string[] tags)
190234
sb.AppendLine(";");
191235
}
192236
#elif EF6
193-
var objectQuery = query.Query.GetObjectQuery();
194-
195-
sb.AppendLine(CachePrefix);
196-
sb.AppendLine(objectQuery.Context.Connection.ConnectionString);
197-
sb.AppendLine(string.Join(";", tags));
198-
199237
var commandTextAndParameters = objectQuery.GetCommandTextAndParameters();
200238
sb.AppendLine(commandTextAndParameters.Item1);
201239

@@ -211,7 +249,17 @@ public static string GetCacheKey<T>(QueryDeferred<T> query, string[] tags)
211249
var command = query.Query.CreateCommand(out queryContext);
212250

213251
sb.AppendLine(CachePrefix);
214-
sb.AppendLine(queryContext.Connection.ConnectionString);
252+
253+
if (IncludeConnectionInCacheKey)
254+
{
255+
var connection = queryContext.Connection.DbConnection;
256+
257+
// FORCE database name in case "ChangeDatabase()" method is used
258+
sb.AppendLine(connection.DataSource ?? "");
259+
sb.AppendLine(connection.Database ?? "");
260+
sb.AppendLine(connection.ConnectionString);
261+
}
262+
215263
sb.AppendLine(string.Join(";", tags));
216264
sb.AppendLine(command.CommandText);
217265

src/Z.EntityFramework.Plus.EF5/Z.EntityFramework.Plus.EF5.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
<Compile Include="_Internal\EF5_EF6\DbContext\DbContext.GetObjectContext.cs" />
155155
<Compile Include="_Internal\EF5_EF6\EntityConnection\GetDbTransaction.cs" />
156156
<Compile Include="_Internal\EF5_EF6\EntityConnection\GetEntityTransaction.cs" />
157+
<Compile Include="_Internal\EF5_EF6\EntityConnection\GetStoreConnection.cs" />
157158
<Compile Include="_Internal\EF5_EF6\EntityConnection\GetStoreTransaction.cs" />
158159
<Compile Include="_Internal\EF5_EF6\IDbSet`\GetDbContext.cs" />
159160
<Compile Include="_Internal\EF5_EF6\IQueryable\IQueryable.GetObjectQuery.cs" />

0 commit comments

Comments
 (0)