在发布时应用 EF 迁移仅适用于某些 Web 项目
Posted
技术标签:
【中文标题】在发布时应用 EF 迁移仅适用于某些 Web 项目【英文标题】:Apply EF migration on publish available only for some web projects 【发布时间】:2016-12-22 20:23:11 【问题描述】:我有几个使用 Asp.Net Core 1.0 和 Entity Framework Core 1.1.0 的项目
我采用代码优先迁移方法,并通过 Visual Studio 2015 发布到 Azure。
我过去在 Azure Sql Server 中应用迁移的方式是在发布时启用一个复选框:“Entity Framework Migrations - Apply this migration on publish”,我在其中输入了一个连接字符串。
我更新了几个包,现在对于我的一个项目,我看不到在发布时应用迁移的此选项。我可以看到 它试图发现数据上下文但它没有找到任何东西(尽管它在同一个项目中..)
见下文:
发布时我可以在 Azure 上应用迁移的项目:
发布时在 Azure 上应用迁移的选项已消失的项目:
我怀疑它与项目的某些依赖版本有关,而不是与我的 IDE 有关,因为我对这两个项目使用相同的 Visual Studio(2015 更新 3)。
我找不到这方面的信息。什么依赖允许这个选项?如果我发现哪个版本有问题,那么剩下的问题是如何在发布时应用迁移?
两个项目在 Web 项目中都有迁移,并且两个项目都使用"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.1.0"
更新 1:我设法找到了其中涉及的内容。看来如果我使用这些依赖项:
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
"Microsoft.EntityFrameworkCore.Design": "1.0.0-preview2-final"
Visual Studio 能够找到数据上下文并提供在发布时应用迁移的选项。但是,如果我使用这些依赖项的较新版本,例如:
"Microsoft.EntityFrameworkCore.Tools": "1.1.0-preview4-final",
"Microsoft.EntityFrameworkCore.Design": "1.1.0"
然后应用迁移的选项消失了,VS 在发布时找不到任何数据上下文。
我需要了解迁移和 Asp.Net Core 的最新状态。
【问题讨论】:
只是出于好奇:在应用程序启动期间调用dbcontext.Database.MigrateAsync()
有什么问题?当您将其部署到 azure 并使用部署槽时,它会执行部署应用程序,然后对其执行一次 ping 操作以确保其在与生产槽交换之前预热
围绕这个有一些争论。就我个人而言,我喜欢在部署应用程序之前应用迁移,这样如果迁移无法应用,当前的应用程序和生产中的数据库就不会有任何问题。如果它作为 Startup 的一部分在代码中,则意味着必须先部署应用程序,然后再应用迁移。如果该迁移无法应用,则该应用程序将停止工作,并且必须重新部署以前的版本。但如果有好的论据,我可以考虑使用dbcontext.Database.MigrateAsync()
?
嗯,这就是为什么我提到 Azure 的部署槽:docs.microsoft.com/en-us/azure/app-service-web/web-sites-staged-publishing 请参阅docs.microsoft.com/en-us/azure/app-service-web/…(尤其是“与预览交换(多阶段交换)”部分)。您基本上会在暂存槽中发布应用程序,它可以触发预热(调用一些强制 IIS 启动应用程序的 url),然后开始切换两者。我认为您也可以将其设置为仅在调用热身的 url 成功时才更改,但现在不确定
并非 Azure 中的所有计划都有多个部署槽。目前我使用的是基本的,所以这不是我的选择。但是,是的,这对于允许这样做的计划来说听起来不错。
我发现 this 相关。您需要在project.json
中添加"postpublish": ["dnx ef database update -e Staging"]
【参考方案1】:
在创建空的 ASP.NET Core Web API 项目并添加迁移后,我在 Visual Studio 2017 中偶然发现了一个非常相似的问题(发布无法在项目中查找要发布的数据上下文)。
为了使其正常工作,我在 .csproj 文件中包含了以下几行:
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.1" />
【讨论】:
【参考方案2】:要使用迁移,您可以使用包管理器控制台 (PMC) 或命令行界面 (CLI) 使用 PMC 时,发布期间不会发现 EF 迁移。 通过使用 CLI,将显示 EF 迁移部分。
https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/migrations https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet【讨论】:
以上是关于在发布时应用 EF 迁移仅适用于某些 Web 项目的主要内容,如果未能解决你的问题,请参考以下文章