Подтвердить что ты не робот

Отладка кода-первых кодов миграции Entity Framework

Сначала я использую код Entity Framework на своем веб-сайте, и мне просто интересно, есть ли способ отладки кодов миграции. Вы знаете, как устанавливать точки останова и тому подобное.

Я использую Package Manager Console для обновления базы данных с помощью Update-Database.

Спасибо

4b9b3361

Ответ 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.exepacakges\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 с созданной строкой и исходным исключением.