appsettings.json
中的连接字符串的登录只有CRUD访问权限,因为安全方面的考虑,所以它无法创建表和列等内容。因此,当我运行以下命令时:dotnet ef database update -c MyDbContextName -e Development
我想告诉它使用不同的连接字符串,但我不知道是否可以这样做?基本上,我想要使用两个不同的连接字符串,一个用于部署,另一个用于运行该应用程序。这可能吗?是否有更好的方法? 谢谢。
appsettings.json
中的连接字符串的登录只有CRUD访问权限,因为安全方面的考虑,所以它无法创建表和列等内容。因此,当我运行以下命令时:dotnet ef database update -c MyDbContextName -e Development
我想告诉它使用不同的连接字符串,但我不知道是否可以这样做?基本上,我想要使用两个不同的连接字符串,一个用于部署,另一个用于运行该应用程序。这可能吗?是否有更好的方法? 谢谢。
dotnet ef database update --connection "connection string"
将两个连接字符串都保留在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
dotnet ef database update
没有提供覆盖连接字符串的选项。但是,您可以指定环境和DbContext选项,因此我建议这是最简单的更改connstr的方法。另一种方法可能是设置一个环境变量,然后在ScaffoldContext
中读取它,但我从未尝试过,因为它看起来太棘手了。 - Ilya Chumakovexport ASPNETCORE_ENVIRONMENT="Development"
dotnet ef database update
当 ASPNETCORE_ENVIRONMENT 与 appsettings.Development.json 匹配并且连接字符串正确配置时。
如果您正在使用Package Manager Console
,请使用以下命令:
Update-Database -Connection "YOUR_CONNECTION_STRING"
我喜欢利用脚手架的DbContext,但是我发现了一些问题(可能可以解决),同时也考虑到如何处理连接字符串的位置。这使我想到另一个更加简单的解决方案,所以我想在这里分享一下。
以下是关于这个通用方法和之后的解决方案:
我不喜欢将暂存/生产环境的连接字符串存储到源代码管理中。所以,我通过环境变量设置在临时命令窗口中传递(或者在命令行中动态传递,但我无法做到)。此时,如果我设置了环境变量,我也可以覆盖使用MyDbContextName
的初始连接字符串,而不是添加新的连接字符串。因此,通过这种方式就能够克服整个脚手架DB上下文的问题了。
我在这个过程中遇到了其他问题:
初始DbContext需要将依赖项注入到构造函数中,那么子上下文也必须这样做。这使得dotnet ef
命令会抱怨缺少无参数构造函数。
为了解决这个问题,在启动时,用.AddDbContext<ChildDbContext>(...)
注册了子上下文。这还需要将ChildDbContext注入DbContextOptions<ParentDbContext>
和DbContextOptions<ChildDbContext>
中。之后,dotnet ef
仍然发现实例化ChildDbContext存在问题,因为它还需要依赖于IConfiguration
,而这无法找到。也许这是由于dotnet-ef
没有完全运行整个应用程序启动所致。
正如我所说的,我想这些问题最终可以解决,但是我仍然在质疑如果你不想将连接字符串保存在专用的appsettings文件中,脚手架上下文的真正价值是什么。一个反驳意见可能是,您可能会忘记设置远程连接字符串的环境变量,但是这时您只需在完成迁移后关闭命令窗口即可。希望对你有所帮助。
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
值来实现。dotnet ef database update --configuration Debug
--connection
可以解决问题,但你不仅需要更新命令行工具,还要把项目引用更新到 5.0+ 版本。 - Andrew