Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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...

like image 608
Gab Avatar asked Feb 12 '15 14:02

Gab


People also ask

How do I code my first migration to an existing database?

Run the Add-Migration InitialCreate command in Package Manager Console. This creates a migration to create the existing schema. Comment out all code in the Up method of the newly created migration. This will allow us to 'apply' the migration to the local database without trying to recreate all the tables etc.

How do I add a table to an existing Entity Framework?

click on Add option. Choose target tables by clicking on check boxes pointing before table name. Then click on ok button, now you will see your newly added tables now. Don't forget to build your solution before performing any actions on current table.


1 Answers

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 Migrations Seed 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.

like image 137
octavioccl Avatar answered Oct 29 '22 09:10

octavioccl