EF核心数据库更新的命令行连接字符串

时间:2017-04-13 17:35:57

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

使用ASP.NET Core和EF Core,我正在尝试将迁移应用于数据库。但是,应用程序将使用的appsettings.json中的连接字符串中的登录仅具有CRUD访问权限,因为安全性问题,因此无法创建表和列等。因此,当我运行时:

dotnet ef database update -c MyDbContextName -e Development

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

7 个答案:

答案 0 :(得分:8)

将两个连接字符串保留在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 

答案 1 :(得分:8)

在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

答案 2 :(得分:1)

我喜欢脚手架DbContext的想法,但我发现了一些问题(不知怎么可以解决,我猜)还有一些关于保持连接字符串的问题。那些让我得到另一个更粗糙的解决方案,所以我想我会在这里分享所有这些。

这是关于一般方法,以及随之而来的解决方案:

  1. 我不喜欢在源代码管理下存储登台/生产连接字符串。所以我会通过临时命令窗口中设置的环境变量传递它(或者可能在命令行中动态传递,尽管我无法做到这一点)。此时,如果我正在设置环境变量,我不妨覆盖 MyDbContextName使用的初始连接字符串,而不是添加新的连接字符串。因此,可以通过这种方式克服整个脚手架DB上下文的事情。
  2. 我在此过程中发现的其他问题:

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

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

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

答案 3 :(得分:1)

在Linux终端中:

export ASPNETCORE_ENVIRONMENT="Development"
dotnet ef database update

ASPNETCORE_ENVIRONMENT与appsettings.Development.json和正确配置的连接字符串匹配的地方。

答案 4 :(得分:0)

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

Update-Database -Connection "YOUR_CONNECTION_STRING"

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:-3)

dotnet ef database update --configuration Debug