Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to incrementally seed data in Entity Framework 4.3

I have been using Entity Framework 4.3 on an existing database and I have a couple of scenarios that I am trying to cater for.

Firstly, if I delete my database I would like to EF to recreate if from scratch - I have successfully used a CreateDatabaseIfNotExists database initialiser for this.

Secondly, if I update my model and the database already exists I would like the database to be updated automatically - I have successfully used Entity Framework 4.3 Migrations for this.

So here's my question. Say I add a new table to my model which requires some reference data, what it the best way to ensure that this data gets created both when the database intialiser runs and also when the migration runs. My desire is that the data gets created when I'm creating the db from scratch and also when the database gets updated as the result of a migration running.

In some EF migrations examples I have seen people use the SQL() function in the UP method of the migration to create seed data but if possible I would rather use the context to create the seed data (as you see in most database initialiser examples) as it seems strange to me that you would use pure sql when the whole idea of EF is abstracting that away. I have tried to use the context in the UP method but for some reason it didn't think that a table that was created in the migration existed when I tried to add the seed data directly below the call to create the table.

Any wisdom greatly appreciated.

like image 627
Jim Culverwell Avatar asked Feb 18 '12 15:02

Jim Culverwell


People also ask

What is running seed method in Entity Framework?

The Seed method takes the database context object as an input parameter, and the code in the method uses that object to add new entities to the database. To seed data into your database, you need to override the Seed method.

How do I seed data in .NET core?

Net core project with Identity, Entity framework and language as C#. In Entity framework , we can define default database table values before creating database model. This concept is called seeding. We are going to use seeding in order to define default users and roles here.

What is reseeding a database?

The reseed-database command enables you to reseed a passive database copy that is in a failed state and restore the copy (using the latest local Snapshot copy; an archived copy cannot be used) to a healthy state.


1 Answers

If you want to use entities to seed data you should use Seed method in your migrations configuration. If you generate fresh project Enable-Migrations you will get this configuration class:

internal sealed class Configuration : DbMigrationsConfiguration<YourContext> {     public Configuration()     {         AutomaticMigrationsEnabled = false;     }      protected override void Seed(CFMigrationsWithNoMagic.BlogContext context)     {         //  This method will be called after migrating to the latest version.          //  You can use the DbSet<T>.AddOrUpdate() helper extension method          //  to avoid creating duplicate seed data. E.g.         //         //    context.People.AddOrUpdate(         //      p => p.FullName,         //      new Person { FullName = "Andrew Peters" },         //      new Person { FullName = "Brice Lambson" },         //      new Person { FullName = "Rowan Miller" }         //    );         //     } } 

The way how migrations seed data are not very efficient because it is supposed to be used for some very basic seeding. Every update to new version will go through whole set and try to update existing data or insert new data. If you don't use AddOrUpdate extension method you must manually ensure that data are seeded to database only if they are not present yet.

If you want efficient way for seeding because you must seed o lot of data you will get better result with common:

public partial class SomeMigration : DbMigration {     public override void Up()     {         ...         Sql("UPDATE ...");         Sql("INSERT ...");     }      public override void Down()     {         ...     } } 
like image 61
Ladislav Mrnka Avatar answered Sep 18 '22 12:09

Ladislav Mrnka