实体框架代码优先于数据库中的默认数据

Sha*_*ean 45 database entity-framework initialization ef-code-first entity-framework-4.1

如何在应用程序启动之前或生成数据库之后处理我需要预先存在的数据的情况.例如,我有一个国家列表,我希望在代码优先生成数据库后将其加载到数据库中.我该怎么做呢?

应用程序的结构如下:

Repository > Service > WebMVC

xml在WebMVC项目中.

Dam*_*amb 67

您创建自定义初始化程序,它继承自DropCreateDatabaseIfModelChangesDropCreateDatabaseAlways接口.喜欢:

public class EntitiesContextInitializer : DropCreateDatabaseIfModelChanges<-YourDbContext->
Run Code Online (Sandbox Code Playgroud)

然后你覆盖种子方法,如:

protected override void Seed(YourDbContext context)
Run Code Online (Sandbox Code Playgroud)

整个示例可能如下所示:

public class EntitiesContextInitializer : DropCreateDatabaseIfModelChanges<EntitiesContext>
{
    protected override void Seed(EntitiesContext context)
    {
        List<Role> roles = new List<Role>
        {
            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();

    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:设置完成后,你必须设置初始化程序,正如Ladislav Mrnka所说.

Database.SetInitializer(new EntitiesContextInitializer());
Run Code Online (Sandbox Code Playgroud)

即:在Global.asax中:

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

别忘了加using System.Data.Entity; .....

  • 在这个方法结束时调用`base.Seed()`并不错. (3认同)
  • 由于某种原因,它执行Database.SetInitializer方法,但它不执行Seed方法.我设置了断点,没有任何反应. (2认同)

Lad*_*nka 11

您必须创建自定义数据库初始化程序,例如从DropCreateDatabaseIfModelChangesoverride和filln Seed方法中填充数据.然后,您必须Database.SetInitializer在应用程序启动时使用设置新的初始化程序.以下是用于在数据库中创建自定义索引的示例(来自CTP5).