Entity Framework Code-first default data in database

后端 未结 3 1105
轻奢々
轻奢々 2020-12-12 15:49

How do I handle situations in which I need pre-existing data before the app is started or right after the database is generated. For example, I have a list of countries in w

3条回答
  •  轮回少年
    2020-12-12 16:16

    You create custom initializer, which inherits from DropCreateDatabaseIfModelChanges or DropCreateDatabaseAlways interface. Like:

    public class EntitiesContextInitializer : DropCreateDatabaseIfModelChanges<-YourDbContext->
    

    And then you overwrite Seed method like:

    protected override void Seed(YourDbContext context)
    

    Whole example might look like:

    public class EntitiesContextInitializer : DropCreateDatabaseIfModelChanges
    {
        protected override void Seed(EntitiesContext context)
        {
            List roles = new List
            {
                new Role {Id=1, Title="Admin"},
                new Role {Id=2, Title="ProjectManager"},
                new Role {Id=3, Title="Developer"}
            };
    
            // add data into context and save to db
            foreach (Role r in roles)
            {
                context.Roles.Add(r);
            }
            context.SaveChanges();
    
        }
    }
    

    Edit: After setting this up, you have to set up Initializer too, as Ladislav Mrnka mentioned.

    Database.SetInitializer(new EntitiesContextInitializer());
    

    ie.: in Global.asax:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
        Database.SetInitializer(new EntitiesContextInitializer());
    }
    

    Don't forget to add using System.Data.Entity; .....

提交回复
热议问题