Сначала я использую код Entity Framework на своем веб-сайте, и мне просто интересно, есть ли способ отладить коды миграции. Вы знаете, как установка точек останова и тому подобное.
Я использую консоль диспетчера пакетов для обновления базы данных с помощью Update-Database
.
Благодарность
Ответы:
Я знаю, что EF Code First Migrations - относительно новый инструмент, но не забывайте, что вы все еще используете .NET.
Итак, вы можете использовать:
if (System.Diagnostics.Debugger.IsAttached == false) { System.Diagnostics.Debugger.Launch(); }
После этого вы можете увидеть свое InnerException.
Или вы можете использовать оператор try ... catch, например: Обработка исключений Entity Framework
источник
Чтобы достичь точки останова в миграции базы данных, установите контекст в MigrateDatabaseToLatestVersion при инициализации.
Database.SetInitializer(new MigrateDatabaseToLatestVersion<EnterContextHere, Configuration>());
Затем вы просто отлаживаете как обычно (запускаете с помощью f5), и точка останова сработает при первом запуске проекта.
Теперь проблема в том, что если вы отлаживаете второй раз, миграция не запустится. Это связано с тем, что таблица __MigrationHistory была обновлена, чтобы показать, что вы перешли на последнюю версию. Чтобы повторно протестировать миграцию, откройте консоль диспетчера пакетов и вернитесь к предыдущей миграции:
Update-Database –TargetMigration: ThePreviousMigrationName
источник
Мой ответ может быть немного глупым, но, тем не менее, вот оно. Если у вас, как и у меня, иногда возникают проблемы с методом 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; // если у вас это отключено, пропустите этот шаг
Отладьте свое приложение, исправьте ошибку и удалите «хак»
источник
Вот более надежный метод, который поможет без особых хлопот:
Шаг № 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, чтобы запустить отладчик и выполнить отладку желаемой миграции базы данных.
migrate.exe "Your.Migrations.Assembly.dll" /scriptFile="foo.sql" /verbose /startupConfigurationFile="Your.Migrations.Assembly.config"
Когда появится диалоговое окно отладчика-селектора, выберите экземпляр Visual Studio, который вы уже открыли.
источник
Вы можете добавить операторы Console.WriteLine в код миграции (не лучшее решение)
Обратите внимание: сообщения отображаются только в том случае, если вы запускаете код миграции с помощью
migrate.exe
утилиты (inpacakges\EntityFramework.x.y.z\tools
). Они не будут отображаться, если вы запустите миграцию через консоль диспетчера пакетов.источник
Мне очень повезло с использованием «Debugger.Launch ()» (как в ответе m_david выше ) в другом месте, но внутри CreateDbContext кажется, что он каким-то образом и прикрепляется, и не прикрепляется. Я имею в виду, что он прикрепляется и начинает пытаться войти в файлы .asm и .cpp (внутренний код). Если я пытаюсь установить точку останова на Console.Writeline, которую я ЗНАЮ, запускается впоследствии (я могу видеть вывод ЛЮБОЙ «КОМАНДЫ миграции dotnet ef»), она одновременно выполняет ее и никогда не достигает точки останова.
Вместо этого у меня сработало следующее:
while (!System.Diagnostics.Debugger.IsAttached) System.Threading.Thread.Sleep(10); // Breakpoint after this...
Вы можете выполнить миграцию и вручную прикрепить с помощью Visual Studio и это будет на самом деле позволит вам пройти через код , как вы ожидаете, это просто больше боли. Что мне действительно стоит попробовать, так это комбинацию обоих методов ...
источник
Я также нашел ловкий трюк здесь , чтобы получить подробную информацию об ошибке ...
По сути, трюк состоит в том, чтобы получить всю информацию из исключения, поместить ее в строку и выбросить новое исключение DbEntityValidationException с сгенерированной строкой и исходным исключением.
источник