Миграция EF Миграции в EFCore - PullRequest
0 голосов
/ 03 мая 2018

У меня есть около 40 миграций в моем текущем приложении .NET Framework. Я портирую базу данных и все ее репозитории в библиотеку .NET Standard, потому что новое приложение написано на .NET Core, что приводит к двойной реализации репозиториев, а в приложении .NET Core нам пришлось использовать Dapper, чтобы не конфликтовать ни с чем. еще.

Итак, я мог бы легко перенести IdentityDbContext и все остальные связанные вещи на EntityFrameworkCore.

Но теперь Миграции. Я знаю, что у Microsoft есть документ по извлечению моделей и DbContext из базы данных. Однако это создает очень длинный метод OnModelCreating со всеми конфигурациями. Похоже, это может сработать. Но, если я хочу внести какие-либо новые изменения, я должен изменить их там и в рамках новой миграции и убедиться, что нет конфликтов. Кроме того, наши текущие миграции имеют ручные настройки, которые гарантируют, что он будет работать для новой базы данных или существующей производственной базы данных. Что-то не позаботилось об этом.

Я хочу перенести существующие отдельные файлы миграции в новый синтаксис кода. Мне все равно, если ручные настройки не учтены, но как-то самые большие вещи конвертируются автоматически.

Например:

.NET Framework:

public override void Up()
{
    CreateTable(
        "dbo.AdditionalCosts",
        c => new
            {
                additionalCostId = c.Int(nullable: false, identity: true),
                shoppingCartId = c.Int(),
                shoppingCartProductId = c.Int(),
                orderId = c.Int(),
                inclPrice = c.Decimal(nullable: false, precision: 18, scale: 3),
                taxPrice = c.Decimal(nullable: false, precision: 18, scale: 3),
                description = c.String(),
                title = c.String(),
                costType = c.Int(nullable: false),
            })
        .PrimaryKey(t => t.additionalCostId)
        .ForeignKey("dbo.Orders", t => t.orderId)
        .ForeignKey("dbo.ShoppingCartProducts", t => t.shoppingCartProductId)
        .ForeignKey("dbo.ShoppingCarts", t => t.shoppingCartId)
        .Index(t => t.shoppingCartId)
        .Index(t => t.shoppingCartProductId)
        .Index(t => t.orderId);
}

.NET Core:

Есть ли где-нибудь инструмент для конвертации?

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.CreateTable(
        "dbo.AdditionalCosts",
        c => new
        {
            additionalCostId = c.Column<int>(nullable: false), //idnetity: true?
            shoppingCartId = c.Column<int>(),
            shoppingCartProductId = c.Column<int>(),
            orderId = c.Column<int>(),
            inclPrice = c.Column<decimal>(nullable: false), //precision: 18, scale: 3?
            taxPrice = c.Column<decimal>(nullable: false), //precision: 18, scale: 3
            description = c.Column<string>(),
            title = c.Column<string>(),
            costType = c.Column<int>(nullable: false),
        }, constraints: table =>
        {
            table.PrimaryKey("PK_AdditionalCost", t => t.additionalCostId);//default naming of PK_? why not automated anymore! :(
            //etc..
        });
        //.PrimaryKey(t => t.additionalCostId)
        //.ForeignKey("dbo.Orders", t => t.orderId)
        //.ForeignKey("dbo.ShoppingCartProducts", t => t.shoppingCartProductId)
        //.ForeignKey("dbo.ShoppingCarts", t => t.shoppingCartId)
        //.Index(t => t.shoppingCartId)
        //.Index(t => t.shoppingCartProductId)
        //.Index(t => t.orderId);
}

1 Ответ

0 голосов
/ 07 мая 2018

У меня в конечном итоге было несколько вариантов:

  1. Просмотрите каждую таблицу, получите правильные имена индексов, имена столбцов и создайте файлы миграции самостоятельно.
  2. Вернитесь в прошлое с кодом и сгенерируйте каждую миграцию снова с EFCore.
  3. Создайте одну миграцию с текущим кодом и попытайтесь выровнять текущую базу данных.
    • Проблема: EFCore генерирует индексы и некоторые имена FK по-разному.

Итак ... в конце концов я просто сгенерировал новую миграцию с текущим кодом, провел сравнение схем в Visual Studio, чтобы проверить реальные различия и внести изменения в вашу миграцию, если это необходимо. Затем перенесите текущие данные в новую базу данных при выпуске. В настоящее время я занимаюсь этим, поэтому могу скорректировать этот ответ позже.

...