如何在ABP Core Zero中使用多数据库?.NET Core 2.0模板配置疑问
我来帮你梳理下在.NET Core 2.0的ABP模板里实现多DbContext隔离的具体步骤,和.NET Framework版本的思路略有不同,因为Core采用了DbContextOptions的配置模式:
第一步:创建第二个DbContext类
新建一个继承自AbpDbContext的上下文,比如DataDbContext,构造函数需要接收DbContextOptions<DataDbContext>和IIocManager参数,这是ABP在Core中要求的标准构造方式:public class DataDbContext : AbpDbContext { // 这里定义你的Data表对应的DbSet public DbSet<YourDataEntity> YourDataEntities { get; set; } public DataDbContext(DbContextOptions<DataDbContext> options, IIocManager iocManager) : base(options, iocManager) { } }第二步:在配置文件中添加第二个连接字符串
打开appsettings.json,在ConnectionStrings节点下新增你的Data库连接字符串:"ConnectionStrings": { "Default": "Server=localhost;Database=AccountDb;Trusted_Connection=True;", "DataDb": "Server=localhost;Database=DataDb;Trusted_Connection=True;" }第三步:在Module类中配置两个DbContext
找到你的项目核心Module类(比如YourProjectNameModule),在ConfigureServices方法里,通过AddAbpDbContext分别配置两个上下文,同时指定对应的连接字符串:public override void ConfigureServices(ServiceConfigurationContext context) { var configuration = context.Services.GetConfiguration(); // 配置原有的AccountDbContext(使用Default连接串) context.Services.AddAbpDbContext<AccountDbContext>(options => { options.DbContextOptions.UseSqlServer(configuration.GetConnectionString("Default")); }); // 配置新增的DataDbContext(使用DataDb连接串) context.Services.AddAbpDbContext<DataDbContext>(options => { options.DbContextOptions.UseSqlServer(configuration.GetConnectionString("DataDb")); }); }第四步:为第二个DbContext配置Code First迁移(可选)
如果用Code First管理数据库,需要为DataDbContext单独创建迁移:
在Package Manager Console中执行:# 创建迁移文件,指定上下文和输出目录 Add-Migration InitialDataDbCreate -Context DataDbContext -OutputDir Migrations\DataMigrations # 更新数据库 Update-Database -Context DataDbContext第五步:在业务逻辑中注入使用
之后你就可以在AppService或者其他需要的地方直接注入DataDbContext,ABP的依赖注入会自动处理实例化,比如:public class DataAppService : ApplicationService { private readonly DataDbContext _dataDbContext; public DataAppService(DataDbContext dataDbContext) { _dataDbContext = dataDbContext; } public async Task<List<YourDataEntity>> GetAllData() { return await _dataDbContext.YourDataEntities.ToListAsync(); } }
简单来说,.NET Core版本的ABP是通过AddAbpDbContext时配置DbContextOptions来绑定连接字符串,替代了Framework版本中构造函数直接传参的方式,这样更符合Core的配置规范。
内容的提问来源于stack exchange,提问作者Luy Santana

