在Dapper中使用存储库模式时,是否需要打开和关闭数据库连接?

时间:2016-03-07 18:19:43

标签: c# repository dapper

在一篇关于使用Dapper(Using Dapper.NET ORM...)实现存储库的文章中,有以下代码:

public class UserRepository : IUserRepository
{
    private IDbConnection _db = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
    public List<User> GetAll()
    {
        return this._db.Query<User>("SELECT * FROM Users").ToList();
    }

    public User Find(int id)
    {
        return this._db.Query<User>("SELECT * FROM Users WHERE UserID = @UserID", new { id }).SingleOrDefault();
    }

    public User Add(User user)
    {
        var sqlQuery = "INSERT INTO Users (FirstName, LastName, Email) VALUES(@FirstName, @LastName, @Email); " + "SELECT CAST(SCOPE_IDENTITY() as int)";
        var userId = this._db.Query<int>(sqlQuery, user).Single();
        user.UserID = userId;
        return user;
    }
}

关于私有IDbConnection,为什么在各个方法中永远不会打开或关闭它?我也在其他地方见过这个。这个模式周围有糖吗?我的直觉是在一个use中包含每个返回值,然后是_db.Open();如下所示,但是,再次,我已经看到在网络上的其他几个引用中没有这样做。

public List<User> GetAll()
{
    using (_db)   //or (IDbConnection _db = new SqlConnection(myConnectionString))
    {
        _db.Open();
        return this._db.Query<User>("SELECT * FROM Users").ToList();
    }
}

1 个答案:

答案 0 :(得分:3)

如果检测到关闭的连接,Dapper确实会自动打开和关闭。所以,如果你不想这样做:它应该仍然可以正常工作。这样做的主要缺点是,您无法通过已关闭的连接轻松地保留事务,因此如果您打算使用连接级事务,最好也可以从内置的连接生命周期管理开始。