ASP.NET核心项目模板随appsettings.json
和appsettings.Development.json
一起提供,默认情况下会在CreateDefaultBuilder中添加。
因为DbContext
的项目与我的ASP.NET核心项目(MyProject.Data
)是分开的,所以我需要为我的上下文实现IDesignTimeDbContextFactory
以便命令Add-Migration
和Update-Database
工作。我不想为我的IDesignTimeDbContextFactory
硬编码我的连接字符串,但在两个项目中重新使用配置。
我的解决方案很少,但我想根据您的经验和意见了解最合理的解决方案。
IDesignTimeDbContextFactory
。IDesignTimeDbContextFactory
项目中实施MyProject.Data
,并将appsettings.json
移动到项目之间共享的某个根目录或configuration
(位于根目录)目录。database.json
数据库创建单独的配置文件,将其与我的.sln
文件放在一起。我该如何分享?
编辑:
这里有类似的问题和答案:ConnectionString from appsettings.json in Data Tier with Entity Framework Core但它没有回答我的问题。根本没有关于数据层的任何内容。我不想重新使用逻辑来添加db上下文。 我想在两个项目中重复使用连接字符串,以避免重复连接字符串。
答案 0 :(得分:2)
虽然通常建议在中心位置进行配置,但没有什么限制单个项目管理自己的配置。
在以下示例中,连接字符串信息存储在外部 datasettings.json 文件中
{
"ConnectionStrings": {
"DefaultConnection": "connection string here"
}
}
图层的自包含设置扩展的简单示例可能类似于
public static class MyServiceCollectionExtensions {
public static IServiceCollection AddMyDataLayer(this IServiceCollection services, string name = "DefaultConnection") {
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("datasettings.json"); //<<< just an example
var connectionStringConfig = builder.Build();
services
.AddEntityFrameworkSqlServer()
.AddDbContext<YourDbContext>((serviceProvider, options) =>
options
.UseSqlServer(connectionStringConfig.GetConnectionString(name))
);
return services;
}
}
并添加到启动
using my.data.layer;
//...
public void ConfigureServices(IServiceCollection services) {
//...
services.AddMyDataLayer();
//...
}
在这种情况下,数据层管理自己的配置。其设置文件位于应用程序设置外部。
还有扩展的空间,因为其他选项也可以在本地进行管理,并且适用于插入式密钥插件解决方案。
Configuration in ASP.NET Core的模块性质允许这种灵活性。
答案 1 :(得分:0)
我对这个主题的看法/意见:
使用您的DbContext(如API / Backend / Frontend)在每个顶层应用程序中使用连接String,因为它们可以在不同的服务器上运行。所以他们应该有自己的设置文件。
要在没有连接字符串的情况下处理来自库的迁移,您可以使用以下方法:
cd /projectWithContextImpl
dotnet ef -s "../projectWithConnString/" migrations list -c NameOfContext
我希望这有点回答你的问题。