將Dapper添加到企業庫?

.net dapper enterprise-library orm

我們使用企業庫作為標準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;
    }
}

然後使用它像這樣:

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,為什麼要使用Enterprise Library?您可以執行查詢,而不是使用DataSet和DataReader,這些查詢返回強類型映射對象。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因