Ответ 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.