一个请求需要调用两个不同的数据库 添加DbContext

当请求进入application中的方法时 会开启一个工作单元    这里面调用不同的DbContext 会默认使用第一次调用的DbContext

需要手动开启工作单元来隔离两个不同的DbContext进行操作

一个请求需要调用两个不同的数据库     添加DbContext

ABP中出现这个问题 看看方法是不是异步的  返回类型是不是Task

1.比如自己封装了一个开启工作单元的方法

        public async Task NewUnitOfWork(Func<Task> Func)
{
using (var unitOfWork = unitOfWorkManager.Begin(TransactionScopeOption.RequiresNew))
{
try
{
await Func.Invoke();
await unitOfWork.CompleteAsync();
}
catch (DbUpdateException)
{ throw new UserFriendlyException("当前记录已经被使用");
}
catch (Exception ex)
{
throw new UserFriendlyException(ex.Message);
}
}
}

2.这个委托里面会写对数据库的查询操作  都是异步的  调用这个委托的时候 也是通过 await调用的 委托的返回值类型就要写Task  不然就会报上面的错误

            await delUnitOfWork.NewUnitOfWork(async () =>
{
distributorGroupModel = await customerGroupGroupRepository.GetAll()
.Where(t => t.Name == "经销商")
.Where(t => t.IsSystem == true)
.FirstOrDefaultAsync();
if (distributorGroupModel == null)
{
throw new UserFriendlyException("初始化数据不存在");
}
customer = await customerRepository.GetAsync(input.Id.Value);
});

添加DbContext   配置连接字符串方式

1.在Web项目的Startup入口配置Dbcontext连接字符串

一个请求需要调用两个不同的数据库     添加DbContext

一个请求需要调用两个不同的数据库     添加DbContext

这三种写法一样 都是获取配置文件中的连接字符串

2.非Web项目 不存在Startup入口 可以在EF的Moduel中配置连接字符串  这个参数可以 直接写连接字符串

一个请求需要调用两个不同的数据库     添加DbContext

如果这种方式报错  就改成下面这样

一个请求需要调用两个不同的数据库     添加DbContext

3.在MyDbContext中重写OnConfiguring进行配置连接字符串

可以通过注入IConfigurationRoot对象来获取appsetting.json配置文件

        private readonly IConfigurationRoot _appConfiguration;

        public Startup(IHostingEnvironment env)
{
_appConfiguration = env.GetAppConfiguration();
}

这个GetAppConfiguration是扩展方法  写在 Web.Core层  所以Application层,Core层,EF层不能引用Web.Core层  所以不能调用这个扩展方法  通过这种方式调用  其实上面那个扩展方法里面就是调用了下面这个方法

        private readonly IConfigurationRoot _appConfiguration;

        public IMSEntityFrameworkModule(IHostingEnvironment env)
{
_appConfiguration = AppConfigurations.Get(env.ContentRootPath, env.EnvironmentName, env.IsDevelopment());
}
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{ // 从 appsetting.json 中获取配置信息
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build(); optionsBuilder.UseSqlServer(config.GetConnectionString("DefaultConnection"));
}
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
configuration = ConfigManager.LoadConfig("appsettings.json");
optionsBuilder.UseSqlServer(configuration["ConnectionStrings"]);
}
上一篇:ssh证书登录(实例详解)


下一篇:Java URLEncoder URLDecoder