Dapperを使用してデータベースにアクセスするたびに、データベースの接続が確実に開いたり閉じたりするようにする

c# dapper database-connection sql sql-server

質問

私のリポジトリクラスの1つで、現在私がやっていることは次のとおりです。

private IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString);

public IEnumerable<Product> GetProducts(int categoryId = null, bool? active = null)
{
    StringBuilder sql = new StringBuilder();
    sql.AppendLine("SELECT * ");
    sql.AppendLine("FROM Product ");
    sql.AppendLine("WHERE @CategoryId IS NULL OR CategoryId = @CategoryId ");
    sql.AppendLine("  AND @Active IS NULL OR Active = @Active");

    return this.db.Query<Product>(sql.ToString(), new { CategoryId = categoryId, Active = active }).ToList();
}

私がしたいことの一つは、他のすべてのreposが継承するBaseRepositoryにIDbConnectionプロパティを置くことです。上記の例のようなデータアクセス関数のそれぞれで、データベースの接続が適切に開閉されるようにするにはどうすればよいですか?ここで私が現在Entity Frameworkで行っていることは何ですか(各関数の説明文を使用していますが、今は純粋なDapperを使用するようにDALを切り替えています:

using (var context = new MyAppContext())
{
    var objList = (from p in context.Products
                   where (categoryId == null || p.CategoryId == categoryId) &&
                         (active == null || p.Active == active)
                   select p).ToList();

    return objList;
}

Dapperのでは、すべてがusingステートメントで囲まれていることに気付いていましたが、ときには、次のように関数を次のようにラップしていることがあります。

using (var connection = Program.GetClosedConnection())

GetClosedConnection()は新しいSqlConnectionを返しますが、その2つの違いは何ですか?

public static SqlConnection GetOpenConnection(bool mars = false)
{
    var cs = connectionString;
    if (mars)
    {
        SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder(cs);
        scsb.MultipleActiveResultSets = true;
        cs = scsb.ConnectionString;
    }
    var connection = new SqlConnection(cs);
    connection.Open();
    return connection;
}
public static SqlConnection GetClosedConnection()
{
    return new SqlConnection(connectionString);
}

受け入れられた回答

ここで私はいつもそれをやったのです:

SqlConnection dbConnection;
using (dbConnection = new SqlConnection(connectionString))
{
    /* 
       Whatever Dapper stuff you want to do. Dapper will open the
       connection and the using will tear it down.
    */
}

あなたの質問の後半部分については、 GetClosedConnection単にインスタンス化SqlConnectionながら、オブジェクトをGetOpenConnectionインスタンス化し、開い SqlConnectionオブジェクトを。あなた(またはDapper)はGetClosedConnection返されたオブジェクトに対してOpen()を手動で呼び出さなければなりませGetClosedConnection


人気のある回答

この回答は、「反駁を避ける」というあなたの希望に基づいています。

Dapperの拡張クラスを作り、その中に関数を入れて代わりに使う。そのようです:

    public IEnumerable<T> Query<T>(string sqlQuery, object parameters = null)
    {
        this.activeConnection.Open();

        var result = this.activeConnection
            .Query<T>(sqlQuery, parameters);

        this.activeConnection.Close();

        return result;
    }

そしてクラスの上に

    public SqlConnection activeConnection { get; private set; }

これは常にクラスのコンストラクタで設定されます。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ