Обновление до MvcMiniProfiler 1.9 с 1.7 .NET MVC3 и EF Code First - PullRequest
1 голос
/ 05 октября 2011

Сегодня я вернулся к проекту, с которым я не работал в течение последнего месяца или около того. Я настроил этот проект, используя MiniProfiler 1.7, и все было хорошо в мире. Он также профилировал мои вызовы БД и производительность просмотра.

Я решил обновить до 1.9, и я столкнулся с несколькими скачками скорости. Сейчас я проработал большинство вопросов на данный момент. Единственное, что кажется «неправильным» - это профилирование БД. Я получаю желтый экран смерти со следующей ошибкой:

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.

Для справки, я покажу вам, как у меня была установка минипрофиля в 1.7 с MVC3 и EF 4.1 Code First.

web.config

  <system.data>
<DbProviderFactories>
  <remove invariant="MvcMiniProfiler.Data.ProfiledDbProvider" />
  <add name="MvcMiniProfiler.Data.ProfiledDbProvider" 
       invariant="MvcMiniProfiler.Data.ProfiledDbProvider" 
       description="MvcMiniProfiler.Data.ProfiledDbProvider" 
       type="MvcMiniProfiler.Data.ProfiledDbProviderFactory, MvcMiniProfiler, Version=1.7.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3" />
</DbProviderFactories>

Global.asax обработал большинство всего оттуда. Я перечислю соответствующий код Application_Start (), который работал раньше, а сейчас нет.

#region MVC Mini Profiler related database profiling config/setup

        //This line makes SQL Formatting smarter so you can copy/paste 
        // from the profiler directly into Query Analyzer
        MiniProfiler.Settings.SqlFormatter = new SqlServerFormatter();

        var factory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["Database"].ConnectionString);
        var profiled = new ProfiledDbConnectionFactory(factory);
        Database.DefaultConnectionFactory = profiled;

#endregion

Последний шаг в моем контексте связан с профилированным соединением:

public class Database : DbContext
{
    public Database()
        : base(GetProfilerConnection(), true)
    {}

    private static DbConnection GetProfilerConnection()
    {
        return
            ProfiledDbConnection.Get(
                new SqlConnection(ConfigurationManager.ConnectionStrings["Database"].ConnectionString));
    }
}

Перенесемся в будущее, и я переделал некоторые вещи, чтобы использовать пакет мини-профилей MVC3 minprofiler и пакет NuFet мини-профилей EF, но я заблудился о том, как заставить профилирование БД работать снова.

Я изменил свой web.config так, чтобы показалось тем, что требовалось, но ReSharper сначала не рад.

  <system.data>
<DbProviderFactories>
  <remove invariant="MvcMiniProfiler.Data.ProfiledDbProvider" />
  <add name="MvcMiniProfiler.Data.ProfiledDbProvider" invariant="MvcMiniProfiler.Data.ProfiledDbProvider"
       description="MvcMiniProfiler.Data.ProfiledDbProvider"
       type="MvcMiniProfiler.Data.ProfiledDbProviderFactory, MvcMiniProfiler.EntityFramework, Version=1.9.1.0, Culture=neutral, PublicKeyToken=b44f9351044011a3" />
</DbProviderFactories>

enter image description here

Не совсем уверен, что мне здесь не хватает. Нужно ли мне это больше с вызовом MiniProfilerEF.Initialize () ;? Некоторые документы и предложения, кажется, указывают на то, что вам это больше не нужно.

Большая проблема заключается в том, как настроить профилирование БД в 1.9.

Соответствующий код, который у меня был ранее в Global.asax, теперь перемещен в MiniProfiler.cs в папке App_Start. Я полагал, что установка была бы такой же, но это не так.

Я хочу сделать это (возможно, потому что это то, с чем я знаком в 1.7)

//TODO: To profile a standard DbConnection: 
        var factory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["Database"].ConnectionString);
        var profiled = new ProfiledDbConnectionFactory(factory);
        Database.DefaultConnectionFactory = profiled;

Кажется, это больше не работает. Я также отметил, что, похоже, мне следует использовать EFProfiledDbConnection вместо просто ProfiledDbConnection? Это правильно?

Как мне настроить профилирование БД с этой моделью? Я копаю все выше и ниже в документации, но так много информации со старым способом смешано с новым, и мне трудно отделить то, что сегодня является «правильным» способом.

1 Ответ

2 голосов
/ 05 октября 2011

Тьфу, извините, ребята.

Я решил проблему.

Мне пришлось добавить пакет EF MVCMiniProfiler NuGet в мой проект модели данных и изменить тип соединения там на EFProfiledConnection, так:

        /// <summary>
    /// Supply our own connection string to the DBContext to utilize mini-profiler for SQL queries as well.
    /// </summary>
    /// <returns>DBConnection</returns>
    private static DbConnection GetProfilerConnection()
    {
        return new EFProfiledDbConnection(new SqlConnection(ConfigurationManager.ConnectionStrings["Database"].ConnectionString),
                                        MiniProfiler.Current);
    }

Думаю, это должно было быть для меня очевидным, если смотреть на то, как EF был разбит на собственный тип подключения.

Я также прокомментировал настройки конфигурации, чтобы подтвердить, что они 'больше не требуется.

Я не знаю, является ли это «правильным» способом настройки EF и MVC Mini 1.9, но он работает.

Я открыт для предложений по улучшению или, если есть более правильный способ сделать это, но сейчас я снова начал работать.

...