比如我现在有两个DBContext :DbContextA
,DbContextB
services.AddDbContextPool<DbContextA>(options => { //options.UseInMemoryDatabase("adult"); options.UseSqlServer(Configuration.GetConnectionString("AdultDbStr")); }); services.AddDbContextPool<DbContextB>(options => { //options.UseInMemoryDatabase("Identity"); options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")); });
当我激活DbContextA的实例时会说
ArgumentException:
Expression of type Microsoft.EntityFrameworkCore.DbContextOptions [DbContextA]
cannot be used for constructor parameter of type
Microsoft.EntityFrameworkCore.DbContextOptions [DbContextB]
当我将DbContextPool
换成DbContext
就没有问题了。
我尝试过将注入顺序调换,结果是用DbContextPool
只会记住最后一个注入的,前边的都是被覆盖掉。
请问这是为什么?
环境:.Net Core 2.1 RC1
DbContextPool 目前还不支持多个。
多谢提醒。
我试过了,AddDbContextPool是支持多个的,我是用两个不同源的类库,所以重点在于注入业务服务时要用IEnumberable<IUserRepository>去接收一组,然后要区分里面哪个是Oracle哪个是SQLServer,具体细节我就不多写了,你可以探索一下。
//services.AddDbContextPool<AuthDbContext>(options =>
// options.UseSqlServer(GetConnectionString(configuration, DatabaseType.SQLServer)));
//services.AddDbContextPool<Microliu.Auth.DataOracle.AuthContext>(options => options.UseOracle(GetConnectionString(configuration, DatabaseType.Oracle)));
我一个类库是DataSqlServer,一个是DataOracle,内容几乎一样,只不过我提供了一个GetDbType(),分别返回库标识。然后在Service扩展一个方法去提取指定数据库源的服务就可以直接进行正常操作了
/// <summary>
/// 扩展满足获取不同数据库源的服务接口
/// 需要实现GetDbType方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="provider"></param>
/// <param name="dbType"></param>
/// <returns></returns>
public static T GetServices<T>(this IServiceProvider provider, DbType dbType)
{
var services = provider.GetServices<T>();
return services.Where(r => (DbType)r.GetType().GetMethod("GetDbType").Invoke(r, null) == dbType).FirstOrDefault();
}
public enum DbType
{
Oracle = 1,
MySQL = 2,
SQLServer = 4
}