zoukankan      html  css  js  c++  java
  • .NetCore关于Cap(RabbitMQ)结合MySql使用出现MySql相关类冲突问题解决办法

    问题还原

    引用了

    DotNetCore.CAP.MySql

    MySql.Data.EntityFrameworkCore

    在使用MySql相关对象的时候会出现如下冲突,在命名空间加入伪空间名称是不能解决这个问题的(注:如果直接用这个Pomelo.EntityFrameworkCore.MySql是不会有问题的)

    解决问题

    出现上面的问题肯定要改造代码,那么我们在只能不用这些对象了

    不用这些对象怎么来实现操作数据库呢?

    所以只用调用上下文对象了,获取连接只能使用 上下文对象中的操作

    之前做了一个CQRS 是直接用Dapper访问的数据,封装了一个工厂,现在我用上下文就不需要这些

    添加DbContext配置

     services.AddDbContext<UserDbContext>(
                          optionsBuilder =>
                          {
                              var _userappsetting = Configuration.GetSection("UserDbConfig").Get<UserDbConfig>();
                              if (_userappsetting == null)
                              {
                                  throw new Exception("数据库连接字符串未配置");
                              }
                              switch (_userappsetting.DbType)
                              {
                                  case 1:
                                      optionsBuilder.UseSqlServer(_userappsetting.UserConnectString, sqlserver =>
                                      {
                                          sqlserver.MigrationsAssembly(_migrationAssablyName);
    
                                          sqlserver.UseRowNumberForPaging();
    
                                      });
                                      break;
                                  case 2:
                                      optionsBuilder.UseMySQL(_userappsetting.UserConnectString, mysql =>
                                      {
                                          mysql.MigrationsAssembly(_migrationAssablyName);
    
                                      });
                                      break;
                                  default:
                                      optionsBuilder.UseMySQL(_userappsetting.UserConnectString, mysql =>
                                      {
                                          mysql.MigrationsAssembly(_migrationAssablyName);
    
                                      });
                                      break;
    
                              }
                          });

    同时将上下文对象注册到构成函数中去

    .AddSingleton<IDbProviderFactory>(p =>
                            {
                                var context = p.GetRequiredService<UserDbContext>();
                                return new CreateDbProviderFactory(context);
                            }

    这样做还有一个好处,不用在根据在工厂类去判断使用的是什么数据库了,这个工作全部都交给了UserDbContext上下文文对象了

    改造后的代码

     public class CreateDbProviderFactory : IDbProviderFactory
        {
            private readonly UserDbContext _context;
            public CreateDbProviderFactory(UserDbContext context)
            {
                _context = context;
            }
    
            public IDbConnection GetConnection()
            {
                return _context.Database.GetDbConnection();
            }
        }

    这样开始来也比较简洁了

    在用户登录查询如下使用

     using (var db = _dbProviderFactory.GetConnection())
                {
                    var model = (await db.QueryAsync<dynamic>("select * from tb_user where username=@username and password=@password", new { @username = username, @password = password })).FirstOrDefault();
                }

    这样做及时解决了冲突的问题,同时还简化了代码

  • 相关阅读:
    VS密钥
    继承中delelte对象子类析构函数不被执行
    [LeetCode] Merge k Sorted Lists
    [LeetCode] Spiral Matrix II
    [LeetCode] Multiply Strings
    [LeetCode] Valid Number
    [LeetCode] Search Insert Position
    [LeetCode] Spiral Matrix
    [LeetCode] Valid Parentheses
    [LeetCode] Rotate List
  • 原文地址:https://www.cnblogs.com/liyouming/p/9209673.html
Copyright © 2011-2022 走看看