Отладка кода-первых кодов миграции Entity Framework
Сначала я использую код Entity Framework на своем веб-сайте, и мне просто интересно, есть ли способ отладки кодов миграции. Вы знаете, как устанавливать точки останова и тому подобное.
Я использую Package Manager Console для обновления базы данных с помощью Update-Database
.
Спасибо
Ответы
Ответ 1
Я знаю, что EF Code First Migrations - относительно новый инструмент, но не забывайте, что вы все еще в .NET.
Итак, вы можете использовать:
if (System.Diagnostics.Debugger.IsAttached == false)
{
System.Diagnostics.Debugger.Launch();
}
После этого вы можете увидеть свое внутреннее исключение.
Или вы можете использовать инструкцию try... catch следующим образом:
Обработка исключений Entity Framework
Ответ 2
Чтобы попасть в точку перерыва в миграции db, установите для параметра инициализация контекст MigrateDatabaseToLatestVersion.
Database.SetInitializer(new MigrateDatabaseToLatestVersion<EnterContextHere, Configuration>());
Затем вы просто отлаживаете как обычно (запустите с помощью f5), и точка останова попадет при первом запуске проекта.
Теперь проблема заключается в том, что если вы отлаживаете второй раз, миграция не будет выполняться. Это связано с тем, что таблица __ MigrationHistory обновлена, чтобы сообщить, что вы перенесли последнюю версию. Чтобы повторно протестировать миграцию, откройте консоль менеджера пакетов и перейдите к предыдущей миграции:
Update-Database –TargetMigration: ThePreviousMigrationName
Ответ 3
Мой ответ может быть немного глупым, но в любом случае здесь.
Если вы, как и я, несколько раз сталкиваетесь с проблемами в методе Seed(), то, что я обычно делаю, это просто создать общедоступный метод, который вызывает Protect Seed().
public void SeedDebug(AppDbContext context)
{
Seed(context);
}
то в моем HomeController я вызываю этот метод в режиме отладки.
public class HomeController : Controller
{
var appDb = new AppDbContext();
public ActionResult Index()
{
var config = new Configuration();
config.SeedDebug(appDb);
return View();
}
}
Я знаю это немного хромое решение, но это просто и быстро.
Конечно, это нужно делать после создания модели.
Итак, шаг за шагом:
- прокомментировать метод семени и выполнить базу данных обновлений для создания модели
-
раскомментируйте метод Seed() и подключите "хак", упомянутый выше.
-
в конфигурации отключить автоматическую миграцию
AutomaticMigrationsEnabled = false;//если у вас это отключено, пропустите этот шаг
-
Отладка вашего приложения, исправление ошибки и удаление "взлома"
Ответ 4
Вы можете добавить операторы Console.WriteLine в код миграции (не большое решение)
Обратите внимание, что сообщения отображаются только при выполнении кода миграции с помощью утилиты migrate.exe
(в pacakges\EntityFramework.x.y.z\tools
). Они не будут отображаться, если вы выполните миграцию через консоль диспетчера пакетов.
Ответ 5
Вот более надежный метод, который без особых хлопот сработает:
Шаг № 1: Поместите этот фрагмент кода прямо над миграцией, которую вы хотите отладить:
public partial class ORACLE_Test : DbMigration
{
public override void Up()
{
if (!System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Launch();
AddColumn("TEST", "UR_USER_ID", x => x.Decimal(nullable: false, precision: 11, scale: 0, storeType: "number"));
AddColumn("TEST", "UR_CLIENT_ID", x => x.Decimal(nullable: false, precision: 11, scale: 0, storeType: "number"));
[...]
}
public override void Down()
{
}
}
Шаг № 2: Скомпилируйте проект, содержащий ваши миграции
Шаг № 3: Откройте консоль внутри выходного каталога (/bin/Debug,/bin/Release и т.д.), Содержащего dll ваших миграций
Шаг № 4: Вызовите migrate.exe с параметром /scriptFile, чтобы запустить отладчик и фактически отладить нужную db-миграцию
migrate.exe "Your.Migrations.Assembly.dll" /scriptFile="foo.sql" /verbose /startupConfigurationFile="Your.Migrations.Assembly.config"
Как только появится диалог выбора отладчика, выберите экземпляр Visual Studio, который вы уже открыли.
Ответ 6
Мне посчастливилось использовать "Debugger.Launch()" (например, в m_david ответить выше) в другом месте, но внутри CreateDbContext кажется как-то как прикрепите, а не прикрепите. Я имею в виду, что он прикрепляется и начинает пытаться входить в файлы .asm и .cpp(внутренний код). Если я попытаюсь установить точку останова на Console.Writeline, которую я буду потом выполнять KNOW (я могу видеть результат из ANY "dotnet ef migrations COMMAND" ), он выполняет ее и никогда не попадает в точку останова.
Это то, что сработало для меня:
while (!System.Diagnostics.Debugger.IsAttached)
System.Threading.Thread.Sleep(10);
// Breakpoint after this...
Вы можете выполнить миграцию и вручную подключиться с помощью Visual Studio, и это позволит вам пройти через код, как вы ожидаете, это скорее боль. То, что я действительно должен попробовать, это сочетание обоих методов...
Ответ 7
Я также нашел аккуратный трюк здесь, чтобы получить сведения об ошибке...
В принципе, трюк состоит в том, чтобы захватить всю информацию из исключения, поместить ее в строку и выбросить новое исключение DbEntityValidationException с созданной строкой и исходным исключением.