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方法.迁移Seed
在DbMigrationsConfiguration类上引入了自己的方法.此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)
对于那些寻找EF Core
解决方案的人,在Up
方法中,并在创建表之后:
IE: migrationBuilder.CreateTable(name: "MyTable", .....
添加以下代码:
migrationBuilder.InsertData(table: "MyTable", column: "MyColumn", value: "MyValue");
或者
migrationBuilder.InsertData(table: "MyTable", columns: ..., values: ...);
有关更多信息,请参阅文档:MigrationBuilder.InsertData 方法