问题还原
引用了
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(); }
这样做及时解决了冲突的问题,同时还简化了代码