【问题标题】:Entity Framework Code-first default data in database实体框架代码优先数据库中的默认数据
【发布时间】:2011-08-05 01:53:17
【问题描述】:

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

应用结构如下:

Repository > Service > WebMVC

xml 在WebMVC 项目中。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 因为我只能使用来自网络前端的文件访问代码,有没有办法让我调用初始化程序或传递数据?
    • 您可以将初始化封装在自定义代码中,并将数据从 Web 应用程序传递给该代码,该代码又将数据传递给您的初始化程序的新实例。
    【解决方案2】:

    您创建自定义初始化程序,它继承自 DropCreateDatabaseIfModelChanges 或 DropCreateDatabaseAlways 接口。喜欢:

    public class EntitiesContextInitializer : DropCreateDatabaseIfModelChanges<-YourDbContext->
    

    然后你像这样覆盖 Seed 方法:

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

    编辑:设置完成后,您还必须设置 Initializer,正如 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; .....

    【讨论】:

    • 这只会创建角色列表。您必须将它们添加到上下文并保存更改。
    • @Dampe 我可以在 webUI 项目中使用 Database.SetInitializer 还是必须在我创建 DbContext 的地方使用它?
    • @Lol 编码器:您可以将其添加到 Global.asax 文件中的 Application_Start 方法中。您将需要添加 Using.System.Data.Entity;
    • 由于某种原因,它执行 Database.SetInitializer 方法,但不执行 Seed 方法。我在里面设置了断点,什么也没发生。
    • 在此方法结束时调用base.Seed() 是个不错的主意。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-27
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多