这是我当前项目中的数据库上下文设计工厂类。要连接到我的数据库,它需要我的连接字符串,该字符串存储在配置文件(_config.json
(中。
public class HiromiContextDesignFactory : IDesignTimeDbContextFactory<HiromiContext>
{
public HiromiContext CreateDbContext(string[] args)
{
var configuration = new ConfigurationBuilder()
.SetBasePath() // What is the path
.AddJsonFile("_config.json")
.Build();
var builder = new DbContextOptionsBuilder<HiromiContext>()
.UseNpgsql(configuration["Connections:Postgre"]);
return new HiromiContext(builder.Options);
}
}
但是,我的配置文件位于另一个项目的根目录中。因此,我不确定应该在SetBasePath()
方法中使用什么路径来访问此文件。我应该如何解决这个问题?
添加您的"另一个"项目作为"当前"项目的项目引用,确保"_config.json"被复制到"另一"项目的构建/项目设置中的输出目录,然后所有工件都应该被复制到当前项目的输出目录。。。
看起来这个问题很简单。@aDisplayName提供的答案非常好,如果你面临同样的问题,这是一个可以接受的解决方案。然而,微软实际上建议在开发过程中使用用户机密来存储敏感数据。
由于迁移只需要数据库上下文设计工厂类(它与应用程序或数据库连接上下文的运行无关,也就是说,对于从DbContext
继承的常规上下文类(,因此我可以安全地将连接字符串存储为用户机密。
我已经链接了上面的文档,但这里是我所做的快速总结。
导航到包含设计工厂类的项目并运行命令
dotnet user-secrets init
dotnet user-secrets set "Connections:Postgres" "CONNECTION_STRING"
然后,在配置生成器上调用AddUserSecrets<T>()
方法,而不是设置基本路径。配置生成器应该是这样的。
var configuration = new ConfigurationBuilder()
.AddUserSecrets<HiromiContext>() // This should be the name of the class that inherits from DbContext.
//.AddUserSecrets(Assembly.GetEntryAssembly()) You can also do this if your database context and database design factory classes are in the same project, which should be the case 99% of the time
.Build();