zoukankan      html  css  js  c++  java
  • 一个请求需要调用两个不同的数据库 添加DbContext

    当请求进入application中的方法时 会开启一个工作单元    这里面调用不同的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连接字符串

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

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

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

    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"]);
            }
  • 相关阅读:
    Mat
    分治法-最近点对问题
    动态规划作业-最长公共子序列问题
    动态规划作业-多段图的最短路径问题
    OpenCV+VisualStudion2017配置
    R入门(二)-对象以及它们的模式和属性
    Big number
    R入门(一)
    Spring-aop
    Spring-ioc
  • 原文地址:https://www.cnblogs.com/jiangchengbiao/p/10231951.html
Copyright © 2011-2022 走看看