Ron*_*lev 3 .net orm enterprise-library dapper
我们使用企业库作为标准DAL.现在,我想享受Dapper的好处.查看实现,它只是扩展连接类.
是否可以设置Dapper扩展企业库,以便我们可以享受这两个世界?或者有人已经创建了这个?
是的,可以想象,而且效果很好.我们使用Dapper来补充一些旧的EntLib代码,简单的查询快速而轻松.最大的挑战是让交易正常运作.您没有提到您正在使用哪个版本的EntLib,而是在事务监视器内部使用4.0和更新的管理连接,因此如果您尝试使用EntLib为范围内的Dapper打开另一个连接,它将自动从轻量级本地事务升级到DTC (分布式事务协调器).EntLib实际上并没有提供一种获取当前打开连接的方法,因此您必须从Database类派生并公开GetOpenConnection方法.
public class EntLibDatabaseWrapper : Database
{
// ...Constructor and overrides...
public IDbConnection GetMyOpenConnection()
{
var connectionWrapper = GetOpenConnection();
return connectionWrapper.Connection;
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用它像这样:
var db = DatabaseFactory.CreateDatabase();
var dbWrapper = new EntLibDatabaseWrapper(db.ConnectionString, db.DbProviderFactory);
using (var scope = new TransactionScope())
{
var connection = dbWrapper.GetMyOpenConnection();
try
{
// Insert a test value using dapper
var fooId =
connection.Query<int>("insert into Foo values (name = @name); select cast(scope_identity() as int",
new { name = "Foo" }).Single();
// Insert a test value using Enterprise Library
var cmd =
db.GetSqlStringCommand(
"insert into Foo values (name = 'Bar'); select cast(scope_identity() as int)");
var barId = int.Parse(db.ExecuteScalar(cmd));
scope.Complete();
}
catch (Exception)
{
connection.Close();
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您有更大的事务范围,则必须在关闭每个连接之前检查是否处于活动事务中.
if(Transaction.Current == null)
connection.Close();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1397 次 |
| 最近记录: |