.net 是否将Dapper添加到企业库?

.net 是否将Dapper添加到企业库?,.net,orm,enterprise-library,dapper,.net,Orm,Enterprise Library,Dapper,我们将企业库用作标准DAL。现在,我想享受整洁的好处。从实现来看,它只是扩展了连接类 是否可以将Dapper设置为扩展企业库,以便我们可以同时享受这两个世界? 或者可能已经有人创建了此库?如果您只能使用Dapper,为什么还要使用Enterprise Library?您不必使用数据集和数据读取器,而是可以执行查询,返回强类型映射对象。是的,这是可以想象的,而且效果非常好。我们正在使用Dapper来补充一些旧的EntLib代码,简单的查询是快速而轻松的。最大的挑战是让事务正常工作。您没有提到您正在

我们将企业库用作标准DAL。现在,我想享受整洁的好处。从实现来看,它只是扩展了连接类

是否可以将Dapper设置为扩展企业库,以便我们可以同时享受这两个世界?
或者可能已经有人创建了此库?

如果您只能使用Dapper,为什么还要使用Enterprise Library?您不必使用数据集和数据读取器,而是可以执行查询,返回强类型映射对象。

是的,这是可以想象的,而且效果非常好。我们正在使用Dapper来补充一些旧的EntLib代码,简单的查询是快速而轻松的。最大的挑战是让事务正常工作。您没有提到您正在使用哪个版本的EntLib,但是4.0和更新版本管理TransactionScope内的连接,因此,如果您尝试在使用EntLib的作用域内为Dapper打开另一个连接,它将自动从轻量级本地事务升级到DTC(分布式事务协调器)。EntLib实际上没有提供获取当前打开连接的方法,因此您必须从数据库类派生并公开GetOpenConnection方法

public class EntLibDatabaseWrapper : Database
{
    // ...Constructor and overrides...

    public IDbConnection GetMyOpenConnection()
    {
        var connectionWrapper = GetOpenConnection();
        return connectionWrapper.Connection;
    }
}
然后像这样使用它:

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;
    }
}

DTC表示“升级为DTC”是什么意思?对不起,缩写词有点让人神魂颠倒了。如果在System.Transactions内打开多个连接,则ADO.NET事务作用域(默认情况下)将自动从本地轻量级事务切换到使用分布式事务协调器管理事务。您必须确保DTC服务正在运行且可访问。如果在现有连接中手动登记事务,则可以避免DTC开销。
if(Transaction.Current == null)
     connection.Close();