首页 > 解决方案 > 使用 ef 代码迁移 dotnetcore 或 packge manager 控制台创建数据库

问题描述

我想基于现有的 ef dotnet core web mvc 项目在本地 sql server 实例上创建数据库。为了实现这一点,我遵循两种方法。一种是使用包管理器控制台。

当我运行更新数据库时使用包管理器控制台它给了我以下错误

Value cannot be null. (Parameter 'connectionString') at Microsoft.EntityFrameworkCore.Utilities.Check.NotEmpty(String value, String parameterName) update database

我的 appsettings 具有以下结构

  {
    "Logging": {
      "LogLevel": {
        "Default": "Debug",
        "System": "Information",
        "Microsoft": "Information"
      }
    },
    "ConnectionStrings": {
      "MyDatabase": "Server=localhost\\SQLEXPRESS;Database=mydevdb;Trusted_Connection=True;"
    },
   
  }

经过一些研究,我觉得它可能正在寻找应用程序设置的结构

connectionStrings -> DefaultConnection 

如果我想保留我现有的应用程序设置来创建这个数据库,可以使用包管理器控制台。

当我进行更多研究时,我发现还有第二种方法是使用dbcontext.Database.migrate()方法。所以我将我的代码更新到下面以使其工作

// CreateWebHostBuilder(args).Build().Run(); //old code

CreateHostBuilder(args).Build().MigrateDatabase().Run();
public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });

我有以下迁移管理器课程

         public static class MigrationManager
            {
                public static IHost MigrateDatabase(this IHost host)
                {
                    using (var scope = host.Services.CreateScope())
                    {
                        using (var appContext = scope.ServiceProvider.GetRequiredService<DataContext>())
                        {
                            try
                            {
                                appContext.Database.Migrate();
                            }
                            catch (Exception ex)
                            {
                                //Log errors or do anything you think it's needed
                                throw;
                            }
                        }
                    }
                    return host;
                }

虽然上面的代码有效,但它仅在我使用CreateHostBuilder而不是CreateWebHostBuilder. 这两者有什么区别,我应该使用哪一个?我希望这只在不存在时创建数据库。是否建议使用包管理器控制台来创建本地数据库或使用上述基于代码的方法?

标签: c#asp.net.netasp.net-mvc.net-core

解决方案


推荐阅读