如何在 C# 中使用 Dapper ORM
譯文鏈接:https://www.infoworld.com/article/3025784/how-to-use-the-dapper-orm-in-c.html?nsdr=true
對象關(guān)系映射(ORM)這個概念已經(jīng)存在很長時間了,ORM的作用就是用來解決 編程領(lǐng)域的 object model 和關(guān)系數(shù)據(jù)庫中的 data model 的不匹配問題,Dapper 是一個開源的,輕量級的 ORM 框架,由 Stack Overflow 團隊開發(fā),Dapper 和其他流行的ORM框架相比,最大的優(yōu)點就是羽翼級。
Dapper在最初開發(fā)時就考慮到了性能和易用性,它支持在 事務(wù),存儲過程 或者 批量插入時進行靜態(tài)或者動態(tài)的對象綁定。
使用 Visual Studio 安裝 Dapper ORM
要想了解 Dapper,從下面的步驟開始吧:
打開 Visual Studio 點擊 文件 -> 新建 ?-> 項目 選擇 網(wǎng)站 -> ASP.Net Web Application 給 web 項目指定一個名字 然后選擇一個 空模板 點擊 確定 生成 project
這樣我們就創(chuàng)建好了一個 ASP.Net web application 項目
如果你已經(jīng)安裝了 NuGet,你可以通過 NuGet 去安裝 Dapper,做法就是在 解決方案窗口 下的 Project 上右鍵選擇 Manage NuGet Package ... 并且找到 Dapper,然后點擊安裝開啟這個安裝過程,一旦 Dapper 被成功安裝,你就可以愉快的玩起來了哈。
使用 Dapper ORM 進行增刪查改
接下來我用 Dapper 寫一些簡單的 CURD 語句來操作數(shù)據(jù)庫,考慮如下的 IDG 數(shù)據(jù)庫,包含了一個 Author 表,表的字段如下:
ID
FirstName
LastName
在使用Dapper時,你需要針對 數(shù)據(jù)庫表 創(chuàng)建一個簡單的實體類(POCO class),下面定義了 Author 實體對應(yīng) IDB 數(shù)據(jù)庫的 Author 表。
????public?class?Author
????{
????????public?int?Id?{?get;?set;?}
????????public?string?FirstName?{?get;?set;?}
????????public?string?LastName?{?get;?set;?}
????}
使用 Dapper 的 Query() 擴展方法,可以實現(xiàn)對數(shù)據(jù)庫的查詢?nèi)缓髮?shù)據(jù)填充到你的 object model 中,下面方法的作用就是從 Author 表中查詢所有的數(shù)據(jù),然后存儲到內(nèi)存中,最后返回一個集合給調(diào)用方。
????public?List?ReadAll()
????{
?????????using?(IDbConnection?db?=?new?SqlConnection(ConfigurationManager.ConnectionStrings[“AdventureWorks”].ConnectionString))
?????????{
?????????????return?db.Query
?????????????(“Select?*?From?Author”).ToList();
?????????}
????}
對了,為了能夠使用上 Dapper 的擴展方法,你需要在代碼文件的頂部引入 Dapper 命名空間,如下圖:

下面的方法展示了如何從 Author table 表中查詢指定的記錄。
????public?Author?Find(int?id)????
????{
????????using?(IDbConnection?db?=?new?SqlConnection(ConfigurationManager.ConnectionStrings?[“AdventureWorks”].ConnectionString))
????????{
????????????return?db.Query(“Select?*?From?Author?“?+?
????????????WHERE?Id?=?@Id”,?new?{?id?}).SingleOrDefault();
????????}
????}
Dapper 的 Execute() 方法可以實現(xiàn)對數(shù)據(jù)的新增,修改,刪除,此方法返回一個整數(shù)值,該值表示在執(zhí)行查詢時受到的影響行數(shù)。
下面的方法展示了如何使用 Dapper 更新一條記錄。
????public?int?Update(Author?author)
????{
????????using?(IDbConnection?db?=?new?SqlConnection(ConfigurationManager.ConnectionStrings?[“AdventureWorks”].ConnectionString))
????????{
????????????string?sqlQuery?="UPDATE?Author?SET?FirstName?=?@FirstName,?"?+
????????????“?LastName?=?@LastName?“?+?“WHERE?Id?=?@Id”;
????????????int?rowsAffected?=?db.Execute(sqlQuery,?author);
????????????return?rowsAffected;
????????}
????}
正如上面代碼所述,Update 方法返回了一個受影響的行數(shù),意味著這么多的記錄被修改,上面這段代碼只會有一條記錄被更新,所以說如果更新成功返回的就是 1。
在 Dapper ORM 中使用 存儲過程
為了能夠使用 Dapper 執(zhí)行存儲過程,在調(diào)用 Query 或者 Execute 方法時需要手工指定一下 CommandType 類型,下面的例子展示了如何使用 Dapper 執(zhí)行 存儲過程。
????public?List?Read()
????{
????????using?(IDbConnection?db?=?new?SqlConnection?(ConfigurationManager.ConnectionStrings?[“AdventureWorks”].ConnectionString))
????????{
????????????string?readSp?="GetAllAuthors";
????????????return?db.Query(readSp,?commandType:?CommandType.StoredProcedure).ToList();
????????}
????}
Dapper 框架也是支持事務(wù)操作的,如果有必要的話可以使用事務(wù),使用方式很簡單,你可以利用 BeginTransaction() 和 EndTransaction() 方法,其實和你使用 ADO.NET 的事務(wù)方式是一摸一樣的,將需要事務(wù)的語句代碼放置在 BeginTransaction 和 EndTransaction 之間即可。
Dapper ORM 真的是相當(dāng)羽翼級 并且非常方便使用,它不會為你生成任何sql語句,在這種情況下還能夠非常便捷的將查詢結(jié)果映射到你的 POCO 對象上,最??的是,它的執(zhí)行速度遠(yuǎn)超 Entity Framework,實際上,能和原生的 ADO.Net 媲美。
