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

时间:2011-04-13 21:24:31

标签: database entity-framework initialization ef-code-first entity-framework-4.1

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

App的结构如下:

Repository > Service > WebMVC

xml位于WebMVC项目中。

3 个答案:

答案 0 :(得分:67)

您创建自定义初始值设定项,它继承自DropCreateDatabaseIfModelChangesDropCreateDatabaseAlways接口。像:

public class EntitiesContextInitializer : DropCreateDatabaseIfModelChanges<-YourDbContext->

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

protected override void Seed(YourDbContext context)

整个示例可能如下所示:

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();

    }
}

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

Database.SetInitializer(new EntitiesContextInitializer());

ie。:在Global.asax:

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

不要忘记添加using System.Data.Entity; .....

答案 1 :(得分:11)

您必须创建自定义数据库初始值设定项,例如从DropCreateDatabaseIfModelChanges派生,并以覆盖Seed方法填充数据。然后,您必须使用Database.SetInitializer在应用程序启动时设置新的初始化程序。 Here是用于在数据库中创建自定义索引的示例(来自CTP5)。

答案 2 :(得分:1)

有关示例,请参阅新的MVC /实体框架教程系列 http://www.asp.net/entity-framework/tutorials#Using%20MVC #1和#4都显示初始化类。