为什么Dapper不需要打开连接?

3
Dapper文档指出它需要一个打开的连接。但是,在Steve Michelotti的Pluralsight课程中,他在执行SQL之前没有打开连接,而我自己测试连接到SQL Server和MS Access时也证实了这一点。 最佳实践是手动控制连接还是将其留给Dapper?是否存在Dapper绝对需要提供打开连接的情况? 以下是针对Access数据库执行的代码示例。然而,我从未打开过连接,但Dapper仍然愉快地返回了Fund对象的集合:
Private ReadOnly _conn As IDbConnection = New OleDbConnection(ConnectionStrings.GetAccessConnectionString(ConnectionStrings.AccessVersion.v2003,
                                                                                                              ConfigurationManager.AppSettings("MSAccessLocation"), ""))
Public Function GetAll() As List(Of Fund) Implements IFundRepository.GetAll
        Return _conn.Query(Of Fund)("SELECT * FROM Funds").ToList()
End Function

你的Pluralsight课程可能已经定义了一个帮助类来处理打开和关闭连接的操作。 - G-Man
1
既然您已经提供了方法,那么您是否在没有打开连接的情况下测试过它呢?请注意,最佳实践是使用“Using”语句,以确保连接尽快被处理。因此,请不要将连接创建为字段,而应该创建为局部变量。 - Tim Schmelter
1
@TimSchmelter 是的,我已经测试过了,在不打开连接的情况下它可以正常工作,并按要求返回数据。我同意通常情况下我会使用 using 语句来显式控制连接,但如果可能的话,我宁愿避免额外的代码,特别是如果 Dapper 已经为我做了这个。 - majjam
@TimSchmelter,我也看了一下源代码,似乎有很多“if (wasClosed) cnn.Open()”这样的行。 - majjam
4
根据此帖子:https://dev59.com/wWcs5IYBdhLWcg3wtmSf,Dapper会自动管理自己的连接。我正在使用NET40版本,其中包含ExecuteCommand方法,其中包含cnn.Open。 - majjam
显示剩余6条评论
1个回答

0
决定将此作为答案发布,因为评论具有有限的格式选项和最大长度... 我赞成TimSchmelter的建议,“不要将连接作为字段创建,而是作为本地变量。” 无论Dapper是否处理连接,您的代码都应该在不需要它时立即处理它。 在这种情况下,
Public Function GetAll() As List(Of Fund) Implements IFundRepository.GetAll

    Using conn As IDbConnection = New DbConnection (_connectionString)

        Dim funds As List(Of Fund) = _conn.Query(Of Fund)("SELECT * FROM Funds").ToList()

        Return funds

    End Using

End Function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,