Dapper를 엔터프라이즈 라이브러리에 추가 하시겠습니까?

.net dapper enterprise-library orm

문제

우리는 표준 DAL로 엔터프라이즈 라이브러리를 사용하고 있습니다. 이제 Dapper의 이점을 즐기고 싶습니다. 구현을 살펴보면 연결 클래스를 확장하는 것입니다.

Dapper가 엔터프라이즈 라이브러리를 확장하여 두 가지를 모두 즐길 수 있다고 생각할 수 있습니까? 아니면 이미 누군가가 이것을 만들었 을까요?

수락 된 답변

네, 상상할 수 있으며 꽤 잘 작동합니다. 우리는 일부 이전 EntLib 코드를 보완하기 위해 Dapper를 사용하고 있으며 간단한 쿼리는 쉽고 간단합니다. 가장 큰 문제는 거래가 제대로 작동하도록하는 것이 었습니다. 사용중인 EntLib 버전은 언급하지 않지만 4.0 이상에서는 TransactionScopes 내부에서 연결을 관리하므로 EntLib를 사용하여 범위 내에서 Dapper에 대한 다른 연결을 열려고하면 자동으로 경량 로컬 트랜잭션에서 DTC로 에스컬레이션됩니다 (분산 트랜잭션 코디네이터). EntLib은 현재 열려있는 연결을 잡는 방법을 제공하지 않으므로 Database 클래스에서 파생되고 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
    {
        var fooId = 
            connection.Query<int>("insert into Foo values (name = @name); select cast(scope_identity() as int", 
                                    new { name = "Foo" }).Single();
        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;
    }
}

더 큰 트랜잭션 범위가있는 경우 각 연결을 닫기 전에 활성 트랜잭션에 있는지 확인해야합니다.

if(Transaction.Current == null)
     connection.Close();

인기 답변

Dapper 만 사용할 수있는 이유는 무엇입니까? DataSets 및 DataReaders를 사용하는 대신 강력한 형식의 매핑 된 개체를 반환하는 쿼리를 실행할 수 있습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow