这是我当前项目中的数据库上下文设计工厂类。要连接到我的数据库,它将查询我的连接字符串,该字符串存储在配置文件(_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()
方法中使用什么路径来访问该文件。我应该如何解决这个问题?
答案 0 :(得分:0)
将“另一个”项目添加为“当前”项目的项目引用,确保将“ _config.json”复制到“另一个”项目的build / project设置中的输出目录中,然后所有工件应复制到当前项目的输出目录...
答案 1 :(得分:0)
看起来这个问题很简单。 @aDisplayName提供的答案效果很好,如果您遇到相同的问题,这是可以接受的解决方案。但是,Microsoft实际上建议使用user secrets来存储开发中的敏感数据。
由于仅迁移需要数据库上下文设计工厂类(它与应用程序或数据库连接上下文的运行无关,即与从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();