Miniprofiler разбивается на отсутствие столбца CreatedOn

У меня есть miniprofiler, установленный в моем веб-приложении (asp.net-mvc) для EF 6.1, и он разбивается на строку со следующим сообщением об ошибке:

Исключение типа "System.Data.SqlClient.SqlException" произошло в MiniProfiler.dll, но не был обработан в коде пользователя

Дополнительная информация: Недопустимое имя столбца "CreatedOn".

Почему это происходит? Раньше у меня был EF 5 и обновлялся до версии 6, а затем 6.1.

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

Кто-нибудь действительно исправил эту ошибку, не работая вокруг нее?

Ответ 1

Я думаю, что отладчик ломается, потому что файлы PDB включены в пакеты MiniProfiler NuGet.

Разрыв возникает, когда исключение генерируется инфраструктурой сущности, поскольку оно пытается определить, существует ли столбец CreatedOn в таблице __MigrationHistory. (Код извлечен с использованием IlSpy из System.Data.Entity.Migrations.History.HistoryRepository.GetUpgradeOperations())

bool flag = false;
try
{
    this.InjectInterceptionContext(legacyHistoryContext);
    using (new TransactionScope(TransactionScopeOption.Suppress))
    {
        (
            from h in legacyHistoryContext.History
            select h.CreatedOn).FirstOrDefault<DateTime>(); // Will throw an exception if the column is absent
    }
    flag = true;
}
catch (EntityException)
{
}
if (flag)
{
    // Remove the column if present (if no exception was thrown)
    yield return new DropColumnOperation("dbo.__MigrationHistory", "CreatedOn", null);
}

Вы можете заметить, что если вы вручную создадите столбец, чтобы избежать исключения, он будет удален при следующем запуске, и исключение вернется. Поскольку MiniProfiler внедряется в DbCommand.ExecuteReader(), он находится на пути исключения до catch (запрос linq преобразуется в sql-запрос и, наконец, выполняется с использованием DbCommand).

У вас есть два решения, позволяющие предотвратить разрыв:

Отключить разрывы для этого типа исключений

Вы можете отключить нарушение определенного исключения в отладчике Visual Studio. Я работаю с Sql CE, поэтому сначала я должен был объявить SqlCeException (шаг 2 - 4). Если вы работаете с SqlServer, вы, вероятно, можете пропустить этот шаг, просто убедитесь, что тип генерируемого исключения уже включен в список.

  • Откройте диалог "Исключения" (меню "Отладка/Исключения" )
  • "Добавить...", выберите "Исключения для общего языка Runtime" как тип.
  • Задайте имя исключения в "System.Data.SqlServerCe.SqlCeException"
  • Подтвердить и сохранить диалог "Исключения".
  • Откройте раздел "Исключение общих условий языка" в списке.
  • Снимите флажки напротив System.Data.SqlServerCe.SqlCeException (или исключение, которое вы выбрали в вашем случае) и закройте диалоговое окно.

Исключение не должно вызывать перерыва. Тем не менее, отладчик не будет ломаться даже в вашем собственном коде, и если другой тип исключения будет выброшен MiniProfiler, в другом случае снова произойдет разрыв.

Удалить файлы PDB

Вы можете удалить файлы PDB MiniProfiler, но вам придется удалить ссылки NuGet:

  • Найдите и создайте копию dll MiniProfiler (из папки вашего проекта bin). Конечно, не делайте копию файлов pdb.
  • Удалите все ссылки NuGet для MiniProfiler.
  • Добавьте ссылки на DLL, скопированную в другую папку.

Недостатком является то, что вы не сможете использовать NuGet для обновления MiniProfiler.

Возможно, лучшим решением было бы удалить PDB из пакета NuGet, но я не знаю, нужны ли они для другой цели.

Изменить

Как указывает jrummell в своем комментарии, файлы PDB можно удалить, используя событие Post Build. Таким образом, вы можете сохранить свои ссылки NuGet.