Skip to content

Commit 8a868fe

Browse files
committed
add Spatial support for EF6
without these any spatial queries fail
1 parent f773543 commit 8a868fe

File tree

2 files changed

+77
-0
lines changed

2 files changed

+77
-0
lines changed

StackExchange.Profiling.EntityFramework6/EFProfiledDbProviderServices.cs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22

33
namespace StackExchange.Profiling.Data
44
{
5+
using System.Collections.Generic;
56
using System.Data.Common;
67
using System.Data.Entity.Core.Common;
78
using System.Data.Entity.Core.Common.CommandTrees;
89
using System.Data.Entity.Core.Metadata.Edm;
10+
using System.Data.Entity.Spatial;
911
using System.Diagnostics;
12+
using System.Linq;
1013
using System.Reflection;
1114
using StackExchange.Profiling;
1215

@@ -160,5 +163,74 @@ private static DbConnection GetRealConnection(DbConnection connection)
160163

161164
return connection;
162165
}
166+
167+
private static DbDataReader GetSpatialDataReader(DbDataReader fromReader)
168+
{
169+
var profiled = fromReader as ProfiledDbDataReader;
170+
if (profiled != null)
171+
{
172+
fromReader = profiled.WrappedReader;
173+
}
174+
return fromReader;
175+
}
176+
177+
public override object GetService(Type type, object key)
178+
{
179+
return _tail.GetService(type, key);
180+
}
181+
182+
public override IEnumerable<object> GetServices(Type type, object key)
183+
{
184+
return _tail.GetServices(type, key);
185+
}
186+
187+
protected override DbSpatialDataReader GetDbSpatialDataReader(DbDataReader fromReader, string manifestToken)
188+
{
189+
var setDbParameterValueMethod =
190+
_tail.GetType().GetMethods(BindingFlags.Instance | BindingFlags.NonPublic).FirstOrDefault(f => f.Name.Equals("GetDbSpatialDataReader"));
191+
192+
var reader = GetSpatialDataReader(fromReader);
193+
194+
195+
if (setDbParameterValueMethod == null)
196+
{
197+
return base.GetDbSpatialDataReader(reader, manifestToken);
198+
}
199+
200+
var result = setDbParameterValueMethod.Invoke(_tail, new object[] { reader, manifestToken });
201+
return result as DbSpatialDataReader;
202+
}
203+
204+
protected override DbSpatialServices DbGetSpatialServices(string manifestToken)
205+
{
206+
var dbGetSpatialServices =
207+
_tail.GetType().GetMethods(BindingFlags.Instance | BindingFlags.NonPublic).FirstOrDefault(f => f.Name.Equals("DbGetSpatialServices"));
208+
209+
return dbGetSpatialServices.Invoke(_tail, new[] { manifestToken }) as DbSpatialServices;
210+
}
211+
212+
213+
214+
215+
protected override void SetDbParameterValue(DbParameter parameter, TypeUsage parameterType, object value)
216+
{
217+
// if this is available in _tail, use it
218+
var setDbParameterValueMethod = _tail.GetType().GetMethods(BindingFlags.Instance | BindingFlags.NonPublic).FirstOrDefault(f => f.Name.Equals("SetDbParameterValue"));
219+
if (setDbParameterValueMethod != null)
220+
{
221+
setDbParameterValueMethod.Invoke(_tail, new[] { parameter, parameterType, value });
222+
return;
223+
}
224+
225+
// this should never need to be called, but just in case get the Provider Value
226+
if (value is DbGeography)
227+
{
228+
value = ((DbGeography)value).ProviderValue;
229+
}
230+
231+
base.SetDbParameterValue(parameter, parameterType, value);
232+
}
233+
234+
163235
}
164236
}

StackExchange.Profiling/Data/ProfiledDbDataReader.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ public override int RecordsAffected
7676
get { return _reader.RecordsAffected; }
7777
}
7878

79+
public DbDataReader WrappedReader
80+
{
81+
get { return _reader; }
82+
}
83+
7984
/// <summary>
8085
/// The
8186
/// </summary>

0 commit comments

Comments
 (0)