Использование mvc-mini-profiler - PullRequest
13 голосов
/ 09 июня 2011

Я пытаюсь использовать mvc-mini-profiler с EFCodeFirst. Я создаю DbProfiledConnection и передаю его DbContext в процессе построения, как показано ниже. Приложение продолжает работать, как и ожидалось, sql не выставляется Profiler.

public class WebContext : DbContext
{
    static DbConnection _connection = new SqlConnection(ConfigurationManager.ConnectionStrings["WebContext"].ConnectionString);
    static DbConnection _profiledConnection = MvcMiniProfiler.Data.ProfiledDbConnection.Get(_connection);        

    public WebContext()
            : base(_profiledConnection, true)
    {   

    }

ой мой плохой.

Я изменил его так, что когда мой WebContext создается в моем UnitOfWork, я передаю ProfiledDbConnection

public UnitOfWork()
{             
    var profiledConnection = MvcMiniProfiler.Data.ProfiledDbConnection.Get(connection);
    this.context = new MyContext(profiledConnection);
}

Я проверил, и MiniProfier Current был установлен в Application_BeginRequest, и он возвращает ProfiledDbConnection, когда я затем пытаюсь выполнить запрос к базе данных, в классе ProfiledDbProviderServices выдается ошибка.

 protected override string GetDbProviderManifestToken(DbConnection connection)
 {
     return tail.GetProviderManifestToken(connection);
 }

этот метод возвращает «Поставщик не возвратил строку ProviderManifestToken». ошибка

1 Ответ

7 голосов
/ 09 июня 2011

I подозреваемый это относится к инициализатору статического поля. Соединения в веб-приложениях не должны быть никогда в любом случае статичными (но не более).

Ключ: что на самом деле получается ProfiledDbConnection? Метод Get возвращает ProfiledDbConnection только в том случае, если вы выполняете профилирование (по текущему запросу), и соединение профилируется по экземпляру MiniProfiler в этом запросе.

Если вы используете статическое поле, то есть два сценария:

  • статическое поле инициализируется без контекста запроса (или контекста запроса не разработчика): профилирование не будет выполняться, поскольку MiniProfiler.Current равно нулю
  • статическое поле инициализировано, но все регистрируется в соответствии с самым первым запросом, который быстро теряется
...