2016-03-07 135 views
0

在有关实现与短小精悍(Using Dapper.NET ORM...)存储库的一篇文章,有下面的代码:在Dapper中使用存储库模式时,是否需要打开和关闭数据库连接?

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,这是为什么从来不开,或在单独的方法关闭?我在别处也看到了这一点。这种模式附近有糖吗?我的直觉是将每个返回包装在一个使用中,后跟一个_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(); 
    } 
} 
+0

Dapper会检查连接是否打开并在需要时调用'Open',但我同意每次在'using'中创建一个新连接会更好。 – juharr

+1

注意:如果你使用Dapper的'AsList()'而不是'ToList()',你将避免列表分配 –

回答

3

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

相关问题