【问题标题】:Command line connection string for EF core database updateEF 核心数据库更新的命令行连接字符串
【发布时间】:2017-09-09 22:37:51
【问题描述】:

使用 ASP.NET Core 和 EF Core,我正在尝试将迁移应用到数据库。但是,应用程序将使用的appsettings.json 连接字符串中的登录名只有CRUD 访问,出于安全考虑,因此无法创建表和列等。所以,当我运行时:

dotnet ef database update -c MyDbContextName -e Development

我想告诉它使用不同的连接字符串,但我不知道这是否可以做到?基本上,我想使用两种不同的连接字符串,一种用于部署,一种用于运行应用程序。这可能吗?有更好的方法吗? 谢谢。

【问题讨论】:

    标签: asp.net-core entity-framework-core


    【解决方案1】:

    在 EF Core 5.0 中,您将像这样在命令行中传递连接字符串,

    dotnet ef database update --connection "connection string"
    

    参考:https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-5.0/whatsnew#new-command-line-parameters-for-namespaces-and-connection-strings

    【讨论】:

    • 以防万一有人像我一样面临这个问题。 --connection 有效,但您不仅必须更新 CLI,还必须更新对 5.0+ 版本的项目引用
    【解决方案2】:

    将两个连接字符串保留在 appsettings.json 中。从主上下文类继承一个子上下文类,并用另一个连接字符串覆盖OnConfiguring

    public class ScaffoldContext : MyDbContextName 
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            string scaffoldConnStr = ConfigurationManager.ConnectionStrings["scaffoldConnStr"].ConnectionString;
    
            optionsBuilder.UseSqlServer(scaffoldConnStr);
        }
    }
    

    然后使用:

    dotnet ef database update -c ScaffoldContext 
    

    【讨论】:

    • 谢谢伊利亚。我接受了你的回答,因为它是正确的,但是你知道有一种方法可以做到这一点,以便其他连接字符串不在 appsettings.json 中,我想将它作为参数传递吗?
    • @NemanjaPerovic,不幸的是dotnet ef database update 没有提供覆盖连接字符串的选项。但是,您可以指定 Environment 和 DbContext 选项,因此我建议更改 connstr 是最简单的方法。另一种方法可能是设置一个环境变量,然后在您的ScaffoldContext 中读取它,但我还没有应用它,因为它看起来太棘手了。
    • @IlyaChumakov 您能否直接从 Azure 暂存/生产环境运行该命令?我试过了,但它抱怨找不到 dotnet-ef。或者可以从本地机器上运行,这是 conn 的优势。指向远程登台/生产数据库的字符串?助教
    • @superjos 我只在本地机器上使用了该命令。您可以设置环境(开发、测试等)覆盖脚手架上的连接字符串。
    • @ChamikaSandamal 不是真的 - 我想我们只是手动更新了一段时间的数据库,而该项目从未走得更远。
    【解决方案3】:

    我喜欢脚手架 DbContext 的想法,但我发现了一些问题(我猜是可以解决的),并且还考虑了将连接字符串保存在何处。这些让我找到了另一个更粗略的解决方案,所以我想我会在这里分享所有这些。

    这是关于一般方法和后续解决方案:

    1. 我不喜欢在源代码控制下存储暂存/生产连接字符串。因此,我将通过在临时命令窗口中设置的环境变量(或者可能在命令行上运行,尽管我无法使其工作)来传递它。此时,如果我要设置环境变量,我不妨覆盖 MyDbContextName 使用的初始连接字符串,而不是添加新的。因此,可以通过这种方式克服整个脚手架 DB 上下文问题。

    我发现的其他问题:

    1. 初始 DbContext 已将依赖项注入到构造函数中,因此子上下文必须相同。这使得dotnet ef 命令抱怨缺少无参数构造函数。

    2. 为了克服这个问题,子上下文也在启动时注册为.AddDbContext<ChildDbContext>(...)。这也要求 ChildDbContext 同时注入 DbContextOptions<ParentDbContext>DbContextOptions<ChildDbContext>。之后,dotnet-ef 仍然发现实例化 ChildDbContext 的问题,因为这还需要依赖于无法找到的 IConfiguration。也许(?)这是因为dotnet-ef 没有贯穿整个应用程序启动。

    正如我所说,我想问题毕竟可以解决,但我仍然质疑脚手架上下文的真正价值,以防您不想将连接字符串保存在专用的 appsettings 文件中。一个反驳的论点可能是您可能忘记了设置为远程连接字符串的环境变量,但是您只需在完成迁移后立即关闭命令窗口。高温

    【讨论】:

    • 您可以在您的秘密保险库中添加连接字符串。我希望 EF Core 的更新数据库命令有 -Connection 参数(我使用 PowerShell 的 Update-Database,它也没有),但它只有 -Context(或 -c 此处)开关,这迫使我们使用 OnConfiguring,它超级笨拙。另外,我应该提一下,如果您要部署到 Azure,请在应用程序的 Configuration 中设置“ConnectionString”设置,并且可以通过 Environment.GetVariable() 读取它。
    【解决方案4】:

    在 Linux 终端中:

    export ASPNETCORE_ENVIRONMENT="Development"
    dotnet ef database update
    

    ASPNETCORE_ENVIRONMENT 与 appsettings.Development.json 匹配并正确配置了连接字符串。

    【讨论】:

      【解决方案5】:

      如果您使用的是Package Manager Console,请使用以下命令:

      Update-Database -Connection "YOUR_CONNECTION_STRING"

      【讨论】:

        【解决方案6】:

        Javier Colombera's answer的启发,我以这种方式解决了这个问题。

        我在 Windows 上的 Bash 终端中运行了以下命令并得到了预期的结果:

        export ASPNETCORE_ENVIRONMENT="Production"
        export ConnectionStrings__DefaultConnection="SslMode=Prefer;TrustServerCertificate=true;Host=<value>;Port=<value>;Database=<value>;Username=<value>;Password=<value>"
        dotnet ef database update
        

        通过环境变量覆盖appsettings.json 中的ConnectionStrings.DefaultConnection 值,我可以避免将生产数据库连接字符串存储在版本控制中。

        请注意,我的项目没有为暂存和生产环境定义默认连接字符串,只为本地开发环境定义了一个。

        【讨论】:

        • 能否请您指向列出所有可用键值选项的文档,例如 ConnectionStrings.DefaultConnection。我很难找到它。
        【解决方案7】:
        dotnet ef database update --configuration Debug 
        

        【讨论】:

        • 虽然这段代码可能会回答这个问题,但如果你添加一些关于 whyhow 的解释,它对 OP 和未来的读者会更有用
        • 在回答老问题时,您还应该解释您的答案对现有答案的补充。
        • 这并不能解决问题,也不能解释为什么你认为应该这样做。
        猜你喜欢
        • 2018-07-04
        • 2019-03-10
        • 1970-01-01
        • 2019-09-22
        • 1970-01-01
        • 1970-01-01
        • 2021-05-25
        • 2016-12-25
        • 2019-09-22
        相关资源
        最近更新 更多