提问者:小点点

在实体框架核心中自动创建数据库


我的应用程序正在被移植到。NET core,它将使用新的EF core和SQLite。我想在应用程序第一次运行时自动创建数据库和表结构。根据EF核心文档,这是使用手动命令完成的

dotnet ef migrations add MyFirstMigration

dotnet ef database update

然而,我不希望最终用户输入这些命令,更希望有应用程序创建和设置数据库的第一次使用。对于EF 6,有如下功能

Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());

但在EF Core,这些似乎并不存在。我找不到任何关于EF core等效的例子或文档,而且EF core文档中的缺失特性列表中也没有提到它。我已经有了模型类设置,所以我可以编写一些代码来根据模型初始化数据库,但是如果框架自动这样做会更容易。我不想自动构建模型或迁移,只是在一个新的数据库上创建表结构。

我是遗漏了什么,还是EF核心中的自动创建表功能缺失了?


共3个答案

匿名用户

如果您已经创建了迁移,则可以在startup.cs中执行它们,如下所示。

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 {
      using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
      {
            var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
            context.Database.Migrate();
      }

      ...

这将使用添加的迁移创建数据库和表。

如果您不使用实体框架迁移,而是只需要在第一次运行时创建与context类完全相同的DbContext模型,那么您可以使用:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 {
      using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
      {
            var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
            context.Database.EnsureCreated();
      }

      ...

取而代之的是。

如果您需要在确保数据库已创建之前删除它,请调用:

            context.Database.EnsureDeleted();

在调用Ensurecreated()之前

改编自:http://docs.identityserver.io/en/latest/quickstarts/7_entity_framework.html?highlight=实体

匿名用户

我的答案与Ricardo的答案非常相似,但我觉得我的方法更简单一些,因为他的using函数中有太多内容,以至于我甚至不确定它在较低级别上的工作原理。

因此,对于那些想要一个简单而干净的解决方案的人来说,这个解决方案可以为您创建一个数据库,让您确切地知道在引擎盖下面发生了什么,这是为您准备的:

public Startup(IHostingEnvironment env)
{
    using (var client = new TargetsContext())
    {
        client.Database.EnsureCreated();
    }
}

这基本上意味着在您创建的DBContext(在本例中,我的代码称为TargetsContext)中,您可以使用DBContext的实例来确保在应用程序中运行Startup.cs时创建类中定义的表。

匿名用户

如果通过startup.cs中Configure的参数列表获取上下文,则可以改为执行以下操作:

public void Configure(IApplicationBuilder app, IHostingEnvironment env,  LoggerFactory loggerFactory,
    ApplicationDbContext context)
 {
      context.Database.Migrate();
      ...