如何使用Azure App Service进行代码优先迁移

时间:2018-05-23 05:28:13

标签: entity-framework azure visual-studio-2017 azure-web-sites

当我在本地运行时,我手动运行以下命令,然后打包并将应用程序发布到我的IIS服务器上。

Add-Migration Initial
Update-Database

当我想发布到azure appservice时,这些命令会自动运行吗?如果是这样,当我将它发布到azure时,它如何知道使用不同的ConnectionString?

我在appsettings.json中添加了azure的connectionString但是我不明白当我发布到azure AppServices时我怎么能告诉我的控制器等使用它

"ConnectionStrings": {
    "AzureTestConnection": "Data Source=tcp:xxxxxx-test.database.windows.net,1433;Initial Catalog=xxxxx;User Id=xxx@yyyy.database.windows.net;Password=xxxxxx",
    "NWMposBackendContext": "Server=(localdb)\\mssqllocaldb;Database=NWMposBackendContext-573f6261-6657-4916-b5dc-1ebd06f7401b;Trusted_Connection=True;MultipleActiveResultSets=true"
  }

我正在尝试使用不同连接字符串的三个配置文件

  1. 本地
  2. 发布到AzureApp-Test
  3. 发布到AzureApp-Prod

1 个答案:

答案 0 :(得分:2)

  

当我想发布到azure appservice时,这些命令会自动运行吗?

EF不支持自动迁移,您可能需要手动执行添加迁移或dotnet ef迁移添加以添加迁移文件。您可以显式执行命令以应用迁移,也可以apply migrations in your code

您可以在Startup.cs文件的Configure方法中添加以下代码:

using (var scope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
    scope.ServiceProvider.GetRequiredService<ApplicationDbContext>().Database.Migrate();
}
  

我正在尝试使用不同连接字符串的三个配置文件

您可以根据环境动态选择连接字符串,所以这是主要步骤,您可以参考它。

  1. 在webapp&gt; property&gt; debug中将ASPNETCORE_ENVIRONMENT值设置为azure。
  2. enter image description here

    2.遵循ASP.NET Core MVC with Entity Framework Core开始。

    3.使用您的两个连接字符串设置appsetting.json。

    {
      "ConnectionStrings": {
        "DefaultConnection": "connectiondefault",
        "azure": "connectionazure"
      },
      "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
          "Default": "Warning"
        }
      }
    }
    

    注意:您还可以将门户网站上数据库中的连接字符串设置为此处,然后您可以在本地测试它,并可以使用调试进行故障排除。

    此外,您可以尝试使用一个连接字符串进行测试,以确保连接到数据库没有问题。

    4.启动开发人员异常页面使用app.UseDeveloperExceptionPage();和启动类中的app.UseExceptionHandler方法显示错误。

            public Startup(IHostingEnvironment env)
            {
                Configuration = new ConfigurationBuilder()
                    .SetBasePath(env.ContentRootPath)
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .Build();
    
                HostingEnvironment = env;
            }
    
            public IConfigurationRoot Configuration { get; }
            public IHostingEnvironment HostingEnvironment { get; }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                if (HostingEnvironment.IsDevelopment())
                {
                    services.AddDbContext<SchoolContext>(options =>
                    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
                }
                else
                {
                    services.AddDbContext<SchoolContext>(options =>
                    options.UseSqlServer(Configuration.GetConnectionString("azure")));
                }
                services.AddMvc();
            }
    

    有关详细信息,请参阅此thread