ef核心在更新数据库期间不使用ASPNETCORE_ENVIRONMENT

joa*_*mja 35 c# entity-framework-core .net-core visual-studio-2017

我使用visual studio通过一定的迁移来更新我的所有环境.它使用下面的命令工作正常.

update-database -Migration initMigrationProduct -c ProductContext -Environment Production
Run Code Online (Sandbox Code Playgroud)

在ef core 2.0中,此命令已更改,参数-Environment已被删除.在文档中说.

"使用2.0,您可以使用ASPNETCORE_ENVIRONMENT环境变量."

https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet

我现在尝试了各种方法,但是当我运行update-databaseef核心2.0时,它不使用ASPNETCORE_ENVIRONMENT变量.我试着在注册表中设置应用程序属性.

请让我知道我需要做些什么来更新不同的环境?

如果我使用不同的lanchsettings启动应用程序,它可以工作但不使用包管理器控制台.

小智 63

要在程序包管理器控制台(PMC)中设置ASPNETCORE_ENVIRONMENT变量,在visual studio内部,到Production,首先使用此命令

$env:ASPNETCORE_ENVIRONMENT='Production'
Run Code Online (Sandbox Code Playgroud)

然后你可以使用

Update-Database
Run Code Online (Sandbox Code Playgroud)

一般.

  • 有效!只是好奇:我需要将其重置为开发还是会在每次构建时自动重置?每个VS启动? (3认同)
  • @DavidLiang它重置每个VS Startup (3认同)
  • 我的 appsettings.json 指向不同的数据库。但是我的 appsettings.Development.json 指向正确的位置。使用: $env:ASPNETCORE_ENVIRONMENT='Development' 然后:更新数据库不起作用。它仍然查看不正确的数据库字符串。https://github.com/aspnet/EntityFrameworkCore/issues/7353#issuecomment-393471579 (3认同)
  • 应该对此进行更多修改,并可能将其添加到文档中。 (2认同)

小智 12

我和这个问题的记者有同样的问题,并在包管理器控制台(PMC)中尝试了最近的解决方案,并使用以下命令设置环境变量:

$env:ASPNETCORE_ENVIRONMENT='YOUR_ENVIRONMENT'
Run Code Online (Sandbox Code Playgroud)

不幸的是,我有一个 ConsoleApplication 并在启动时使用通用主机构建器Host.CreateDefaultBuilder()。在这种情况下,环境变量前缀不是 ASPNETCORE_but DOTNET_

对我来说,这个命令在 PMC 中有效:

$env:DOTNET_ENVIRONMENT='YOUR_ENVIRONMENT'
Run Code Online (Sandbox Code Playgroud)

我要感谢 Martin Florin 和其他人引导我走向正确的方向。


bru*_*ina 6

从 EF Core 5.0 开始,也可以使用 --environment 参数提供环境,但您还需要在之前指定“--”标记:

dotnet ef database update -- --environment Production
Run Code Online (Sandbox Code Playgroud)

正如文档所述:

-- 标记指示 dotnet ef 将后面的所有内容视为参数,而不是尝试将它们解析为选项。dotnet ef 未使用的任何额外参数都将转发到应用程序

  • 当尝试利用“IDesignTimeDbContextFactory<SomeDbContext>”方法时,似乎没有在“CreateDbContext”上下文中设置ENV。这里有什么想法吗? (4认同)
  • 在 powershell 中运行会产生错误:“无法识别的选项‘--’”。有谁知道如何解决?我尝试了“--%”,也不起作用。 (4认同)

joa*_*mja 1

在 Visual Studio 中使用包管理器对我来说是一条死胡同。解决方案是:

  1. 在解决方案的启动项目的 .csproj 中添加以下内容:

    <ItemGroup>
        <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
    </ItemGroup>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 打开命令工具(cmd)并进入与启动项目所在的.csproj相同的文件夹(默认项目)。

  3. 按照 Anton Toshik 建议运行命令set ASPNETCORE_ENVIRONMENT=Production

4.然后运行命令dotnet ef database update initMigrationProduct -c ProductContext现在就可以了。

备注:在此命令中databaseupdate自早期版本以来已更改位置。并且没有用于迁移的参数/代码。文档在此澄清后解释了更多信息:
https ://learn.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet