2016-03-07 64 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檢測到關閉連接,它確實會自動打開和關閉。所以如果你不想這麼做:它應該仍然可以正常工作。這樣做的主要缺點是你不能輕鬆地通過關閉的連接取消事務,所以如果你打算使用連接級事務,最好從內置連接生命週期管理開始。

相關問題