首页 新闻 会员 周边

EF Core 的AddDbContextPool的疑问

0
悬赏园豆:50 [已解决问题] 解决于 2018-05-15 19:30

比如我现在有两个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

Bluto的主页 Bluto | 菜鸟二级 | 园豆:317
提问于:2018-05-15 09:54
< >
分享
最佳答案
0

DbContextPool 目前还不支持多个。

收获园豆:50
czd890 | 专家六级 |园豆:14412 | 2018-05-15 17:30

多谢提醒。

Bluto | 园豆:317 (菜鸟二级) | 2018-05-15 19:30
其他回答(1)
0

我试过了,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)));
China-Liu | 园豆:202 (菜鸟二级) | 2019-08-21 16:21

我一个类库是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
}

支持(0) 反对(0) China-Liu | 园豆:202 (菜鸟二级) | 2019-08-21 16:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册