cap mysql_.NetCore关于Cap(RabbitMQ)结合MySql使用出现MySql相关类冲突问题解决办法
問題還原
引用了
DotNetCore.CAP.MySql
MySql.Data.EntityFrameworkCore
在使用MySql相關對象的時候會出現如下沖突,在命名空間加入偽空間名稱是不能解決這個問題的(注:如果直接用這個Pomelo.EntityFrameworkCore.MySql是不會有問題的)
解決問題
出現上面的問題肯定要改造代碼,那么我們在只能不用這些對象了
不用這些對象怎么來實現操作數據庫呢?
所以只用調用上下文對象了,獲取連接只能使用 上下文對象中的操作
之前做了一個CQRS 是直接用Dapper訪問的數據,封裝了一個工廠,現在我用上下文就不需要這些
添加DbContext配置
services.AddDbContext(
optionsBuilder=>{var _userappsetting = Configuration.GetSection("UserDbConfig").Get();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(p =>{var context = p.GetRequiredService();return newCreateDbProviderFactory(context);
}
這樣做還有一個好處,不用在根據在工廠類去判斷使用的是什么數據庫了,這個工作全部都交給了UserDbContext上下文文對象了
改造后的代碼
public classCreateDbProviderFactory : IDbProviderFactory
{private readonlyUserDbContext _context;publicCreateDbProviderFactory(UserDbContext context)
{
_context=context;
}publicIDbConnection GetConnection()
{return_context.Database.GetDbConnection();
}
}
這樣開始來也比較簡潔了
在用戶登錄查詢如下使用
using (var db =_dbProviderFactory.GetConnection())
{var model = (await db.QueryAsync("select * from tb_user where username=@username and password=@password", new { @username = username, @password =password })).FirstOrDefault();
}
這樣做及時解決了沖突的問題,同時還簡化了代碼
總結
以上是生活随笔為你收集整理的cap mysql_.NetCore关于Cap(RabbitMQ)结合MySql使用出现MySql相关类冲突问题解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个性微信签名大全男生
- 下一篇: 做输卵管造影有什么伤害