Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mini profiler upgrade from 1.7 to 1.9 breaks existing code

I have a asp.net project that uses mvc-mini-profiler. I was using version 1.7 of the NuGet package and I noticed that there is an updated package whose version is 1.9. I updated the package and now my code no longer compiles. The code that fails to compile is:

public static T GetProfiledContext<T>() where T : System.Data.Objects.ObjectContext
{
    var conn = GetStoreConnection<T>();
    if (_enableProfiling)
    {
        conn = ProfiledDbConnection.Get(conn);
    }
    return ObjectContextUtils.CreateObjectContext<T>(conn);
}

The compilation errors report the following issues:

  • 'MvcMiniProfiler.Data.ProfiledDbConnection' does not contain a definition for 'Get'.
  • The name 'ObjectContextUtils' does not exist in the current context.

I noticed that I can create an instance of ProfiledDbConnection and pass it the connection and an object of type IDbProfiler, but I am not sure how I should obtain that object.

Regarding ObjectContextUtils, I have no clue of what I am supposed to use.

How can I fix these issues?


Update:

By following @monkeychatter's recommendations, I managed to build the code. I now get the following runtime exception:

A null was returned after calling the 'get_ProviderFactory' method on a store provider instance of type 'MvcMiniProfiler.Data.ProfiledDbConnection'. The store provider might not be functioning correctly.

By inspecting ProfiledDbConnection in ILSpy, I noticed that it no longer overrides the DbProviderFactory. That seems to be the cause of the error, since the base implementation returns null. Has anybody been able to work around this issue?

like image 558
Antoine Aubry Avatar asked Feb 02 '23 14:02

Antoine Aubry


1 Answers

I just went through the same and unfortunately most/all documentation shows the 'old' way. The majority of this functionality has been moved to the ProfiledDbConnection class itself. To get the ObjectContext extension on ProfiledDbConnection you also need to reference an assembly from the nuget package 'MiniProfiler.EF'. Below are the edits to get the equivalent code in 1.9.

//reference extension from MvcMiniProfiler.Data
using MvcMiniProfiler.Data;

var conn = GetStoreConnection<T>();   
if (_enableProfiling)   
{   
    //conn = ProfiledDbConnection.Get(conn);   
    conn = new ProfiledDbConnection(conn, MiniProfiler.Current);
}   
//return ObjectContextUtils.CreateObjectContext<T>(conn);
return conn.CreateObjectContext<T>();

Update: Per your updated question I would replace the line in my previous solution as below. This includes an override to fix up the ProviderFactory issue:

    //conn = new ProfiledDbConnection(conn, MiniProfiler.Current);
    conn = new EFProfiledDbConnection(conn, MiniProfiler.Current);
like image 96
tonysurma Avatar answered Feb 05 '23 16:02

tonysurma