The provider did not return a DbSpatialServices instance

I have an MVC 4 project using EF 5 Code First. I pulled MiniProfiler 2.0.1 and MiniProfiler.EF 2.0.2 from NuGet, added the following on the Global.asax.cs:

protected void Application_Start()
{
    MiniProfilerEF.Initialize(); 
}

Immediately upon run, I get this error:

##The provider did not return a DbSpatialServices instance.##

Line 58:   if (user != null)
Line 59:   {
Line 60:>>>    if (user.Places != null)
Line 61:       {
Line 62:            var place= user.Places.OrderByDescending(x => x.CreationTime).FirstOrDefault();

[ProviderIncompatibleException: The provider did not return a DbSpatialServices instance.]
   System.Data.Common.DbProviderServices.GetDbSpatialDataReader(DbDataReader fromReader, String manifestToken) +62
   System.Data.Common.DbProviderServices.GetSpatialDataReader(DbDataReader fromReader, String manifestToken) +101
   System.Data.Spatial.SpatialHelpers.CreateSpatialDataReader(MetadataWorkspace workspace, DbDataReader reader) +70
   System.Data.Common.Internal.Materialization.Shaper.CreateSpatialDataReader() +12
   System.Data.Common.Utils.Singleton`1.get_Value() +25
   System.Data.Common.Internal.Materialization.Shaper.<GetSpatialPropertyValueWithErrorHandling>b__d(DbDataReader reader, Int32 column) +12
   System.Data.Common.Internal.Materialization.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal) +149
   System.Data.Common.Internal.Materialization.Shaper.GetSpatialPropertyValueWithErrorHandling(Int32 ordinal, String propertyName, String typeName, PrimitiveTypeKind spatialTypeKind) +269
   lambda_method(Closure , Shaper ) +942
   System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly(Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet) +239
   lambda_method(Closure , Shaper ) +221
   System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper) +163
   System.Data.Common.Internal.Materialization.SimpleEnumerator.MoveNext() +88
   System.Data.Objects.DataClasses.RelatedEnd.Merge(IEnumerable`1 collection, MergeOption mergeOption, Boolean setIsLoaded) +222
   System.Data.Objects.DataClasses.EntityCollection`1.Load(List`1 collection, MergeOption mergeOption) +218
   System.Data.Objects.DataClasses.EntityCollection`1.Load(MergeOption mergeOption) +25
   System.Data.Objects.DataClasses.RelatedEnd.Load() +37
   System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad() +300
   System.Data.Objects.Internal.LazyLoadBehavior.LoadProperty(TItem propertyValue, String relationshipName, String targetRoleName, Boolean mustBeNull, Object wrapperObject) +85
   System.Data.Objects.Internal.<>c__DisplayClass7`2.<GetInterceptorDelegate>b__1(TProxy proxy, TItem item) +105
   System.Data.Entity.DynamicProxies.User_C006B0EF9498157C70250EEE038C6BEADB719A2D5BDC4AA1FB567FB579AECEB5.get_Places() +55
   Project.Web.Controllers.PlaceController.Ribbon() in c:\Project\Project.Web\Controllers\PlaceController.cs:60
   lambda_method(Closure , ControllerBase , Object[] ) +62
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +204
   System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +30
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +45
   System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +58
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +225
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +225
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +225
   System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +47
   System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +24
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +102
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +42
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +54
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +44
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +9
   System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__4(IAsyncResult asyncResult) +25
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
   System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +47
   System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +23
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +59
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.Mvc.<>c__DisplayClassa.<EndProcessRequest>b__9() +22
   System.Web.Mvc.<>c__DisplayClass4.<Wrap>b__3() +10
   System.Web.Mvc.ServerExecuteHttpHandlerWrapper.Wrap(Func`1 func) +27
   System.Web.Mvc.ServerExecuteHttpHandlerWrapper.Wrap(Action action) +64
   System.Web.Mvc.ServerExecuteHttpHandlerAsyncWrapper.EndProcessRequest(IAsyncResult result) +71
   System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride) +1121

I have a couple of DbGeography types in my Places POCO.

public class Places 
{
    public Guid PlacesId { get; set; }
    ...
    public DbGeography Location { get; set; }
    public DbGeography Area { get; set; }
    ...
}

Phaedrus,

How are you wrapping your connection?

Also, can you create a small repo as an example? If so, please respond back with a link to the repo.

Thanks,
Ben

The same issue for me

MiniProfiler works great apart from on pages that use DbGeography when you get a yellow screen of death instead.

The specified type member ‘GeoLocation’ is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

public DbGeography GeoLocation { get; set; }

When I comment out MiniProfiler then my code works.

I use StructureMap:

For<.Entities>().HybridHttpOrThreadLocalScoped().Use(()
=> new Entities());

(added . to the first Entities otherwise it didn’t show in this editor)

Is there any update on this?

I’ve created a branch which adds support for spatial in Sql Server, if people are interested. However, it requires targeting .net 4.5.


Tested with very read and write tests for SqlGeography points.

Hi Murray,

Your branch is working great when its just about returning geometries. Unfortunately it still crashes on spatial queries.

Try for example something like:

public IQueryable<DbGeometry> GetWithin(DbGeometry geometry, int limit)
{
    return _dbContext.Features.Where(x => x.PolygonShape.Intersects(geometry))
        .Select(x => x.PolygonShape).Take(limit);
}

Thanks!

I’ve got this to work by grabbing the patch from https://github.com/ligos/MiniProfiler and adding this simple extra override in a similar manner to the ProfiledDbProviderServices.cs file in the StackExchange.Profiling.EntityFramework project:

    protected override void SetDbParameterValue(DbParameter parameter, System.Data.Metadata.Edm.TypeUsage parameterType, object value)
    {
        if (value is DbGeography) {
            value = ((DbGeography) value).ProviderValue;
        }
        base.SetDbParameterValue(parameter, parameterType, value);
    }

I haven’t tested it extensively yet, however a spatial query worked for me!

Cheers
Trev

I performed what Trevor did and it worked for me. My issue was surfacing on dynamic data pages that had any DbGeography fields.

Would love to profile stuff returning DbGeography instances but I don’t have enough knowhow to grab MiniProfiler, apply the patches from Murray and Trevor, and then use the result. Hoping someone integrates this into the main distribution. Pretty please? :smile:

This is included in MiniProfiler.EF6 3.0.10-beta5