场景
在开发过程中,有时候有一些比较复杂的业务,我个人比较喜欢直接用dapper执行原生SQL语句。还有一些简单的CURD可能直接使用EF Core实现。所以程序中会混用2种ORM
问题
由于业务需要事务,那么一开始我想当然的就直接使用dapper的connection.BeginTransaction。然后在里面执行dapper的SQL语句,还有执行ef的上下文。因为二者是使用不同的connection。所以EF这边我就使用了dbContext.Database.UseTransaction(transcation as DbTransaction);结果就报错了。
The specified transaction is not associated with the current connection. Only transactions associated with the current connection may be used.
想想也是应该的。因为二者使用不同的连接,如果使用同一事务势必会造成不同连接线程间的安全问题。
后来查看EF可以修改连接:
dbContext.Database.SetDbConnection(connection as DbConnection);
手动修改EF上下文的连接方式,跟dapper同步即可以解决。