在 EF 代码首次迁移期间创建 table 并向其中插入数据

Create table and insert data into it during EF code first migration

我正在使用 Entity Framework Code First 和 Code First 迁移。

在迁移过程中,我需要创建一个新的 table,然后向其中插入一些数据。

所以我用 :

创建了 table
CreateTable("MySchema.MyNewTable",
    c => new
    {
        MYCOLUMNID = c.Int(nullable: false, identity: true),
        MYCOLUMNNAME = c.String(),
     })
   .PrimaryKey(t => t.MYCOLUMNID);

然后我尝试插入数据:

using (var context = new MyContext())
{
    context.MyNewTableDbSet.AddOrUpdate(new[]
    {
    new MyNewTable
    {
       MYCOLUMNNAME = "Test"
    }
    });
    context.SaveChanges();
}

但是我得到一个错误:

Invalid object name 'mySchema.MyNewTable'.

是否可以满足我的需求?创建一个 table 并在同一迁移中向其中插入数据 ?

我已经有其他迁移,我在其中创建 table 或将数据插入 table,但从未在同一个迁移中...

我的建议是将插入代码移动到 Seed method. Migrations introduced its own Seed method on the DbMigrationsConfiguration class。此 Seed 方法在两个重要方面不同于数据库初始化程序 Seed 方法:

  • 每当执行 Update-Database PowerShell 命令时,它 运行s。 除非正在使用 Migrations 初始值设定项,否则 Migrations Seed 应用程序启动时不会执行方法。
  • 它必须处理数据库已经包含数据的情况,因为 迁移正在发展数据库而不是删除和 重新创建它。

出于最后一个原因,在 Seed 方法中使用 AddOrUpdate 扩展方法很有用。 AddOrUpdate 可以检查数据库中是否已经存在一个实体,如果不存在则插入一个新实体,如果存在则更新现有实体。

所以,尝试 运行 您想要的脚本:

 Update-Database –TargetMigration: ScriptName 

Seed 方法将完成插入数据的工作。

正如 Julie Lerman 所说 blog:

The job of AddOrUpdate is to ensure that you don’t create duplicates when you seed data during development.

在迁移中做 "random" 事情的一种方法是使用 Sql method 并传递您需要执行的任何 SQL 语句,例如,插入数据。

如果您希望迁移能够生成完整的迁移 SQL 脚本,包括您的数据操作(Seed 方法只能在代码中执行,不会生成任何sql 脚本)。

你可以试试这个方法: 创建 table 后, 使用以下命令在您的程序包管理器控制台中创建另一个空迁移:

Add-Migration "MigrationName"

然后打开该迁移的 .cs 文件,并在 Up() 方法中插入此代码:

Sql("INSERT INTO MyNewTable(NyColumnName) Values('Test')");

之后,保存并返回包管理器控制台并使用以下命令更新数据库:

Update-Database

对于那些寻找 EF Core 解决方案的人,在 Up 方法中,并在创建 table 之后:

即:migrationBuilder.CreateTable(name: "MyTable", .....

添加以下代码:

migrationBuilder.InsertData(table: "MyTable", column: "MyColumn", value: "MyValue");

migrationBuilder.InsertData(table: "MyTable", columns: ..., values: ...);

有关更多信息,请参阅文档:MigrationBuilder.InsertData Method

首先我运行那个

PM> Add-Migration MyTableInsertInto

然后我得到了关注,

**此迁移文件的设计器代码包含当前代码优先模型的快照。此快照用于计算下一次迁移时对模型的更改。如果您对要包含在此迁移中的模型进行其他更改,则可以通过 运行 再次 'Add-Migration MyTableInsertInto' re-scaffold 它。 ** 我使用以下代码进行 C# 数据迁移

public partial class MyTableInsertInto : DbMigration
    {
        public override void Up()
        {
            Sql("INSERT INTO MyNewTable(MyColumnName) Values ('Test')");
        }
        
        public override void Down()
        {
            Sql("DELETE MyNewTable WHERE MyColumnName= 'Test'");
        }
    }

那我运行关注

下午>update-database

指定“-Verbose”标志以查看应用于目标数据库的 SQL 语句。 应用显式迁移:[202204120936266_MyNewTableInsertInto]。 应用显式迁移:202204120936266_MyNewTableInsertInto。 运行 种子方法。

在 运行ning 之后,种子方法数据库更新成功,这对我来说很好用。