Database 实体框架代码数据库中的第一个默认数据
我如何处理在应用程序启动之前或数据库生成之后需要预先存在的数据的情况。例如,我有一个国家的列表,在代码第一次生成数据库后,我想将这些国家加载到数据库中。我该怎么做 应用程序的结构如下所示:Database 实体框架代码数据库中的第一个默认数据,database,entity-framework,initialization,ef-code-first,entity-framework-4.1,Database,Entity Framework,Initialization,Ef Code First,Entity Framework 4.1,我如何处理在应用程序启动之前或数据库生成之后需要预先存在的数据的情况。例如,我有一个国家的列表,在代码第一次生成数据库后,我想将这些国家加载到数据库中。我该怎么做 应用程序的结构如下所示: Repository>Service>WebMVC xml位于WebMVC项目中。您必须创建自定义数据库初始值设定项,例如从DropCreateDatabaseIfModelChanges派生,并在重写的Seed方法中填充数据。然后必须使用数据库.SetInitializer在应用程序启动时设置新的初始值设定
Repository>Service>WebMVC
xml位于
WebMVC
项目中。您必须创建自定义数据库初始值设定项,例如从DropCreateDatabaseIfModelChanges
派生,并在重写的Seed
方法中填充数据。然后必须使用数据库.SetInitializer
在应用程序启动时设置新的初始值设定项。是用于在数据库中创建自定义索引的示例(来自CTP5)。您创建自定义初始值设定项,该初始值设定项继承自DropCreateDatabaseIfModelChanges
或DropCreateDatabaseAlways
接口。比如:
public class EntitiesContextInitializer : DropCreateDatabaseIfModelChanges<-YourDbContext->
整个示例可能如下所示:
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();
}
}
例如:在Global.asax中:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
Database.SetInitializer(new EntitiesContextInitializer());
}
不要忘记使用System.Data.Entity添加代码>
…有关示例,请参阅位于
#1和#4都显示初始值设定项类。这只会创建角色列表。您必须将它们添加到上下文中并保存更改。@Damp我可以在webUI项目中使用Database.SetInitializer吗,还是必须在创建DbContext的位置?@Lol coder:您可以将其添加到Global.asax文件中的应用程序\u Start
方法中。您需要添加Using.System.Data.Entity;出于某种原因,它执行Database.SetInitializer方法,但不执行Seed方法。我在其中设置了断点,但什么也没发生。在这个方法的末尾调用base.Seed()
不是一个坏主意。因为我只能使用web前端的文件访问代码,有什么方法可以让我调用初始值设定项或传递数据吗?您可以用自定义代码包装初始化,并将数据从web应用传递到该代码,该代码将反过来将数据传递到初始值设定项的新实例。
Database.SetInitializer(new EntitiesContextInitializer());
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
Database.SetInitializer(new EntitiesContextInitializer());
}