EntityFrameworkCore:如何初始化数据库并在用户第一次使用应用程序时播种它

时间:2016-11-11 14:09:14

标签: entity-framework-core

我使用Microsoft Visual Studio 2015和EntityFrameworkCore构建了一个项目。

我手动种子几个虚拟数据,我正在开发我的解决方案。现在,我想在服务器中部署,但是我遇到的问题是,第一次启动应用程序时,它崩溃了,因为它没有找到数据库和数据。

我已经google了,我找到了Visual Studio 2013和之前的解决方案,使用了需要该软件包的 CreateDatabaseIfNotExists 类: System.Data.Entity http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-first.aspx)但是,EntityFrameworkCore中不存在这样的类和包。

如果用户第一次在EntityFrameworkCore中使用我的应用程序,如何创建并填充至少一行的数据库?

或者它与Entity Framework Core中的 System.Data.Entity 相同?

1 个答案:

答案 0 :(得分:2)

Rowan Miller says ApplyMigrations足以创建数据库(如果不存在)并应用所有(nesessary)迁移。

创建这样的方法:

public void CreateDbAndSampleData(IServiceProvider applicationServices)
{
    using (var serviceScope = applicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
    {
        using (var db = serviceProvider.GetService<ApplicationDbContext>()) 
        {
            // This will [try to] create database
            // and apply all necessary migrations
            db.Database.AsRelational().ApplyMigrations();

            // then you can check for existing data and modify something
            var admin = db.Users.Where(x => x.Name == "Superadmin").FirstOrDefault();
            if (admin == null)
            {
                db.Users.Add(new User {...});
                db.SaveChanges();
            }
        }
    }
}

并在Startup.cs方法结束时从Configure拨打电话:

CreateDbAndSampleData(app.ApplicationServices);

此代码将在每个应用启动时运行,因此您需要准确并且不要覆盖任何非关键数据更改(例如更改用户评论等)

您可以使用MusicStore个应用作为示例:Startup.csSampleData.cs