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

Gab*_*Gab 12 c# entity-framework ef-migrations entity-framework-6

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

在迁移期间,我需要创建一个新表,然后将一些数据插入其中.

所以我创建表:

CreateTable("MySchema.MyNewTable",
    c => new
    {
        MYCOLUMNID = c.Int(nullable: false, identity: true),
        MYCOLUMNNAME = c.String(),
     })
   .PrimaryKey(t => t.MYCOLUMNID);
Run Code Online (Sandbox Code Playgroud)

然后我尝试插入数据:

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

但是我收到一个错误:

无效的对象名称'mySchema.MyNewTable'.

有可能做我需要的吗?在同一个迁移中创建一个表和inserto数据?

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

oct*_*ccl 15

我的建议是将代码插入Seed方法.迁移SeedDbMigrationsConfiguration类上引入了自己的方法.此Seed方法Seed在两个重要方面与数据库初始化方法不同:

  • 它会在Update-Database执行PowerShell命令时运行.除非正在使用迁移初始化程序,否则在Seed 应用程序启动时将不会执行迁移方法.
  • 它必须处理数据库已包含数据的情况,因为迁移正在演变数据库而不是删除并重新创建数据库.

由于最后一个原因,在AddOrUpdate方法中使用扩展方法很有用Seed.AddOrUpdate可以检查数据库中是否已存在实体,然后插入新实体(如果该实体尚不存在)或更新现有实体(如果存在实体).

因此,尝试以这种方式运行您想要的脚本:

 Update-Database –TargetMigration: ScriptName 
Run Code Online (Sandbox Code Playgroud)

并且该Seed方法将完成插入数据的工作.

正如Julie Lerman在她的博客上所说:

AddOrUpdate的工作是确保在开发期间为数据设定种子时不创建重复项.


小智 10

您可以尝试这种方法:创建表后,使用以下命令在Package Manager控制台中创建另一个空迁移:

Add-Migration "MigrationName"
Run Code Online (Sandbox Code Playgroud)

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

Sql("INSERT INTO MyNewTable(NyColumnName) Values('Test')");
Run Code Online (Sandbox Code Playgroud)

之后,保存并返回到Package Manager控制台,并使用以下命令更新数据库:

Update-Database
Run Code Online (Sandbox Code Playgroud)

  • @egmfrs您是否使用EntityFrameworkCore?这个问题与EntityFramework6有关。在EntityFrameworkCore中,您将使用“ migrationBuilder.Sql()”(其中“ migrationBuilder”是“ Up()”方法的第一个参数的名称)代替“ this.Sql()”。 (3认同)

Fra*_*lls 7

在迁移中执行"随机"操作的方法是使用Sql方法并传递您需要执行的任何SQL语句,例如,插入数据.

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


Hiz*_*abr 5

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

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

添加以下代码:

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

或者

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

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