【问题标题】:ef core doesn't use ASPNETCORE_ENVIRONMENT during update-databaseef core 在更新数据库期间不使用 ASPNETCORE_ENVIRONMENT
【发布时间】:2018-02-03 11:37:40
【问题描述】:

我使用 Visual Studio 通过某种迁移来更新我的所有环境。使用下面的命令运行良好。

update-database -Migration initMigrationProduct -c ProductContext -Environment Production

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

"在 2.0 中,您可以使用 ASPNETCORE_ENVIRONMENT 环境变量 而是。”

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

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

请让我知道我需要做什么才能使其工作以更新不同的环境?

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

【问题讨论】:

  • 在执行命令之前尝试set ASPNETCORE_ENVIRONMENT=EnvironmentName
  • 您使用的是 PowerShell 提示符吗?您需要使用$env:ASPNETCORE_ENVIRONMENT='EnvironmentName'
  • 我试过了,我在 Visual Studio 的 PM 控制台中设置了 ASPNETCORE_ENVIRONMENT=Production 但它不使用环境它只是使用默认开发。
  • 请注意,在 $env:ASPNETCORE_ENVIRONMENT = "Development" 的可接受答案中,$env 部分区分大小写。 $Env:ASPNETCORE_ENVIRONMENT 在某些情况下会起作用,但 IDesignTimeDbContextFactory 不会选择它。在这件事上挠了挠头……

标签: c# .net-core visual-studio-2017 entity-framework-core


【解决方案1】:

要在 Visual Studio 中的包管理器控制台 (PMC) 中将 ASPNETCORE_ENVIRONMENT 变量设置为生产,请首先使用此命令

$env:ASPNETCORE_ENVIRONMENT='Production'

然后就可以使用了

Update-Database

通常。

【讨论】:

  • 成功了!只是好奇:我需要将它重置为开发还是会在每次构建时自动重置?每个 VS 启动?
  • 这应该得到更多的支持,并可能添加到文档中。
  • @DavidLiang 在每次 VS 启动时都会重置
  • 我的 appsettings.json 指向不同的数据库。但是我的 appsettings.Development.json 指向正确的位置。使用:$env:ASPNETCORE_ENVIRONMENT='Development' 然后:update-database 不起作用。它仍然查看不正确的数据库字符串。 github.com/aspnet/EntityFrameworkCore/issues/…
  • @Vočko 你可以使用命令:Remove-Item env:ASPNETCORE_ENVIRONMENT
【解决方案2】:

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

dotnet ef database update -- --environment Production

正如documentation 所说:

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

【讨论】:

  • 在尝试利用IDesignTimeDbContextFactory<SomeDbContext> 方法时,似乎没有在CreateDbContext 的上下文中设置ENV。有什么想法吗?
  • 在 powershell 中运行会产生错误:unrecognized option '--'。有谁知道如何解决?我试过--%,也没有用。
【解决方案3】:

我遇到了和本期记者一样的问题,在包管理器控制台(PMC)中尝试了最近的解决方案,并使用命令设置环境变量:

$env:ASPNETCORE_ENVIRONMENT='YOUR_ENVIRONMENT'

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

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

$env:DOTNET_ENVIRONMENT='YOUR_ENVIRONMENT'

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

【讨论】:

  • 嗨,我删除了说你无法发表评论的文字,因为这样的陈述不应该成为答案的一部分。此外,它不适用于此处,因为您确实发布了答案而不是评论;)
【解决方案4】:

根据EntityFrameworkCore#6846正确的解决方案是使用--environment选项,dotnet ef命令不尊重ASPNETCORE_ENVIRONMENT

dotnet ef database update --environment Production

【讨论】:

  • @AlexeyStrakh 对我来说,问题是连接字符串在开发环境中有不同的名称
  • 根据the official documentation, --environment 选项指定的是构建环境,而不是配置环境。
  • 在 ef cli 中使用环境的解决方案不再有效,ef core 2.0 及更高版本现在尊重环境设置参考:[github.com/dotnet/efcore/issues/15026#issuecomment-472967827]
  • 我想我有点晚了,但是,.net 5 仍然使用 --environment 命令,你只需要在此之前添加第二对连字符。 “-- --environment Production” 第一个 -- 将告诉 CLI 将其余部分解释为参数。
  • 在powershell中运行不起作用:unrecognized option '--'
【解决方案5】:

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

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

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

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

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

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

【讨论】:

  • 我在将所有内容升级到核心 2.0 时遇到了同样的问题。 @bricelam 响应对我有用(即使我更喜欢旧的方式),我在这里发布了同样的问题和响应:github.com/aspnet/EntityFrameworkCore/issues/9664
  • 尝试为“开发”环境执行此操作。我遇到了同样的问题,但我无法让它与上述解决方案一起使用。我有 appsettings.json 和 appsettings.development.json (每个都有不同的数据库连接字符串)。上述方法在 cmd 或包管理器中都不起作用。配置在应用程序本身的两种环境中都被正确提取。希望有任何见解!
  • 发生的事情是 ef 从设置 ASPNETCORE_ENVIRONMENT 读取环境。在 cmd 中运行更新数据库之前,请使用 "echo %ASPNETCORE_ENVIRONMENT%" 检查您指向的环境。并作为 deepinsight 检查您的 startup.cs 和行。 .AddJsonFile($"appsettings.{env.EnvironmentName}.json", 可选:true)
  • 并自动更新数据库,您可以在配置/启动中添加。 DbInitializer.Initialize(_context) 并在该方法中添加 _context.Database.MigrateAsync() 。当您启动环境时,迁移将应用于环境。
猜你喜欢
  • 2017-03-16
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多