问题描述
I'm using Entity Framework Code First with Code First migrations.
During a migration, I need to create a new table, and then insert some data into it.
So I create the table with :
CreateTable("MySchema.MyNewTable",
c => new
{
MYCOLUMNID = c.Int(nullable: false, identity: true),
MYCOLUMNNAME = c.String(),
})
.PrimaryKey(t => t.MYCOLUMNID);
Then I try to insert data with :
using (var context = new MyContext())
{
context.MyNewTableDbSet.AddOrUpdate(new[]
{
new MyNewTable
{
MYCOLUMNNAME = "Test"
}
});
context.SaveChanges();
}
But I get an error :
Invalid object name 'mySchema.MyNewTable'.
Is it possible to do what I need ? Create a table and inserto data into it in the same migration ?
I already have other migrations where I create tables or insert data into a table, but never in the same migration...
My recommendation is move that insert code to the Seed method. Migrations introduced its own Seed
method on the DbMigrationsConfiguration class. This Seed
method is different from the database initializer Seed
method in two important ways:
- It runs whenever the
Update-Database
PowerShell command is executed. Unless the Migrations initializer is being used the MigrationsSeed
method will not be executed when your application starts. - It must handle cases where the database already contains data because Migrations is evolving the database rather than dropping and recreating it.
For that last reason it is useful to use the AddOrUpdate
extension method in the Seed
method. AddOrUpdate
can check whether or not an entity already exists in the database and then either insert a new entity if it doesn’t already exist or update the existing entity if it does exist.
So, try to run the script that you want this way:
Update-Database –TargetMigration: ScriptName
And the Seed
method will do the job of inserting data.
As Julie Lerman said on her blog:
The job of AddOrUpdate is to ensure that you don’t create duplicates when you seed data during development.
这篇关于在 EF 代码首次迁移期间创建表并将数据插入其中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!