将EF迁移迁移到EFCore

时间:2018-05-03 14:32:10

标签: c# entity-framework .net-core entity-framework-core .net-standard

我目前的.NET Framework应用程序中有大约40次迁移。我正在将数据库及其所有存储库移植到.NET标准库,因为新的应用程序是用.NET Core编写的,这会导致存储库的双重实现,而在.NET Core应用程序中,我们必须使用Dapper来与任何东西冲突其他

因此,我可以轻松地将IdentityDbContext和所有其他相关内容移植到EntityFrameworkCore

但现在是迁移。我知道Microsoft有一个document从数据库中检索模型和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 :(得分:0)

我最终有几个选择:

  1. 遍历每个表,获取正确的索引名称,列名称并自行创建迁移文件。
  2. 回到代码中并使用EFCore再次生成每次迁移。
  3. 使用当前代码生成一次迁移,并以某种方式尝试对齐当前数据库。
    • 问题:EFCore以不同方式生成索引和一些FK名称。
  4. 所以..最终我只使用当前代码生成了一个新的迁移,在Visual Studio中进行了一次Schema比较,以检查真正的差异,并根据需要调整迁移。然后,在释放时将当前数据迁移到新数据库。我目前正在这样做,所以我可能会稍后调整这个答案。