Использование 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". ошибка
Ответы
Ответ 1
Я подозреваю, что это связано с инициализатором статического поля. Соединения в веб-приложениях никогда не должны быть статическими в любом случае (но не более чем для запроса).
Ключ: что на самом деле ProfiledDbConnection
вышло? Метод Get
возвращает ProfiledDbConnection
только в том случае, если вы в настоящее время профилируете (по текущему запросу), и соединение профилируется с экземпляром MiniProfiler
по этому запросу.
Если вы используете статическое поле, то есть два сценария:
- статическое поле инициализируется без контекста запроса (или контекста запроса не-разработчика): профилирование не будет выполняться, поскольку
MiniProfiler.Current
имеет значение null
- статическое поле инициализируется, но все регистрируется в запросе очень сначала, который быстро мертв