Подтвердить что ты не робот

Использование mvc-mini-profiler

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

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)
    {   

    }

oops my bad.

Я изменил его так, чтобы, когда мой 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". ошибка

4b9b3361

Ответ 1

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

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

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

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