.netasp.net-mvc-3entity-framework-4seedef-model-first

How to seed data when using Model First approach?


So I am learning MVC3 and EF4. I tried the code first method but it was too confusing for me.. I can create the classes no problem, but the hard part comes when dealing with foreign keys and the relationships between each other.

But I've gone with model first. This way I can visually design it and see where the relationships are.

After my model is create, it creates a SQL for me which I execute against my SQL Express database. Done, and done.

Now I want data in my tables. Of course I can just add them in using server explorer, but most likely I will be making changes to my model as I go along. And keep updating the database. So I can't keep manually entering data. I know if you use code first you can derive the DropCreateDatabaseIfModelChanges and override the seed method.

However how do I do this with model first approach? I have the following code:

 public class DatabaseInitializer : IDatabaseInitializer<BettingContext> {
    public void InitializeDatabase(BettingContext context) {
        var teams = new List<Team> {
            new Team { Name="Toronto Maple Leafs", League="NHL"},
            new Team { Name="Boston Bruins", League="NHL"},
            new Team { Name="Vancouver Canucks", League="NHL"},
            new Team { Name="Nashville Predators", League="NHL"},
            new Team { Name="Montreal Canadiens", League="NHL"},
        };
    }
}

Of course and in my global file:

protected void Application_Start()
{
    Database.SetInitializer<BettingContext>(new DatabaseInitializer());
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}

so now what? How do I tell it to run the method? What am I doing wrong?


Solution

  • You can have something like this:

    public class MySeedData : DropCreateDatabaseIfModelChanges<YourDataBaseContextClass>
    {
        protected override void Seed(YourDataBaseContextClass context)
        {  
           // Create objects here and add them to your context DBSets...
    
        }
    }
    
    public class YourDataBaseContextClass : DbContext
    {
    
    
    }
    

    Then, within Application_Start() you call:

    Database.SetInitializer(new MySeedData());
    

    In your case, you could try creating DbSets (using your model first classes) manually and try to plug it using the code above. It's kind of a mix of Model First + Code First.

    public class FourthCoffeeWebContext : DbContext
    {
        public DbSet<Category> Categories { get; set; }
        public DbSet<Product> Products { get; set; }
    }
    

    Adding to this: CreateDatabaseIfNotExists<(Of <(<'TContext>)>)>