Fork me on GitHub

.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();
            }

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

 

posted @ 2018-06-21 16:24  龙码精神  阅读(1333)  评论(0编辑  收藏  举报