Налагодження кодів міграції коду першої сутності Entity Framework


138

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

Я використовую консоль Package Manager для оновлення бази даних за допомогою Update-Database.

Дякую


Це просто стандартний код C #, так що так, звичайно, ви можете встановити в ньому точки
прориву

1
але програма насправді не працює, оскільки я використовую консоль Package Manager.
Даніель

1
Тоді не виконуйте оновлення з консолі менеджера пакунків, але встановіть ініціалізатор міграції як ініціалізатор за замовчуванням, щоб база даних мігся при першому підключенні програми до неї.
Wiktor Zychla

Я оновлюю свою базу даних, використовуючи код міграції, і я не можу зупинити додаток і запустити його знову для запуску ініціалізатора.
Даніель

Причиною того, що я не використовую SQL, є те, що код для оновлення є досить складним, і реалізувати його за допомогою SQL майже неможливо.
Даніель

Відповіді:


255

Я знаю, що перша міграція коду EF є порівняно новим інструментом, але не забувайте про те, що ви все ще в .NET.

Отже, ви можете використовувати:

if (System.Diagnostics.Debugger.IsAttached == false)
{
    System.Diagnostics.Debugger.Launch();
}

Після цього ви можете побачити своє InnerException.

Або ви можете скористатись оператором спробувати ... catch на зразок цього: Обробка виключень Entity Framework


3
Так, це працює під час роботи Update-Database через консоль менеджера пакунків. Дуже зручно!
Том Фергюсон

11
Я додав це до початку мого методу Configuration.Seed. Це спричиняє спливаюче вікно, яке дозволяє вам вибрати Visual Studio для налагодження коду. Однак моя система зависає, коли я вибираю її (можливо, не пов'язану).
Талон

3
Куди поставити цей фрагмент коду? якщо хтось може допомогти! Дякую.
Арітра Б

4
У конструкторі вашого конфігураційного класу.
Кейсі

5
@Talon Go схопи каву і до того моменту, коли ти повернешся, мабуть, з’явився ще один екземпляр Visual Studio. :)
Корстіан Бурман

11

Щоб досягти точки перелому в міграції db, встановіть контекст на MigrateDatabaseToLatestVersion при ініціалізації.

Database.SetInitializer(new MigrateDatabaseToLatestVersion<EnterContextHere, Configuration>());

Тоді ви просто налагодите як звичайний (запустіть за допомогою f5), і точка розриву буде потрапляти під час першого запуску проекту.

Проблема зараз полягає в тому, що якщо ви будете налагоджувати вдруге міграція не запуститься. Це тому, що таблицю __MigrationHistory було оновлено, щоб сказати, що ви перейшли на останню версію. Щоб повторно перевірити міграцію, відкрийте консоль менеджера пакунків та поверніться до попередньої міграції:

Update-Database TargetMigration: ThePreviousMigrationName

8

Моя відповідь може бути трохи нерозумною, але все одно тут йдеться. Якщо у вас, як і у мене, виникають проблеми в методі 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();
    }
}

Я знаю, що це трохи кульгаве рішення, але це просто і швидко. Звичайно, це потрібно зробити після створення моделі. Тож крок за кроком:

  1. прокоментуйте початковий метод та виконайте оновлення бази даних для створення моделі
  2. відменюйте метод Seed () та підключіть "хак", про який я згадував вище.

  3. у конфігурації відключити автоматичні міграції

    AutomaticMigrationsEnabled = false; // якщо ви відключили цю функцію, вже пропустіть цей крок

  4. Налагоджуйте свою програму, виправте помилку та видаліть "хак"


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"

Після появи діалогового вікна вибору налагоджувача виберіть екземпляр візуальної студії, який ви вже відкрили.


4

Ви можете додати заяви консолі.WriteLine до міграційного коду (не чудове рішення)

Зауважте, повідомлення відображаються лише у тому випадку, якщо запустити код міграції за допомогою migrate.exeутиліти (в pacakges\EntityFramework.x.y.z\tools). Вони не відображатимуться, якщо запустити міграцію через консоль менеджера пакунків.


Дякую Томе ... Це була найближча відповідь, яку я міг отримати. Якщо ніхто не відповість на це кращим рішенням, я відзначу це як відповідь. :)
Даніель

Або киньте виняток зі своїм повідомленням, яке ви хочете повернути.
David d C e Freitas

2

Мені пощастило використовувати "Debugger.Launch ()" (як, наприклад, у відповіді m_david вище ) деінде, але всередині CreateDbContext, здається, якимось чином прикріплюється, а не вкладається. Що я маю на увазі, це додається і починає намагатися вступити в .asm файли і .cpp файли (внутрішній код). Якщо я спробую встановити точку розриву на Console.Writeline, яку я знаю, після цього виконується (я бачу вихід з будь-якого "dotnet ef migrations COMMAND"), він виконує його і ніколи не потрапляє на точку зламу.

Це замість мене працювало:

while (!System.Diagnostics.Debugger.IsAttached)
    System.Threading.Thread.Sleep(10);

// Breakpoint after this...

Ви можете виконати міграцію і вручну прикріпити з допомогою Visual Studio і це буде на самому ділі дозволить вам пройти через код , як ви очікуєте, це просто більше болю. Що я дійсно повинен спробувати, це поєднання обох методів ...


До якого процесу ви приєднуєтесь?
XDS

-1

Я також знайшов спритний трюк тут , щоб отримати докладну інформацію про помилку ...

В основному, хитрість полягає в тому, щоб схопити всю інформацію за винятком, помістити її в рядок і викинути нову DbEntityValidationException з генерованим рядком та оригінальним винятком.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.