Dapper.Contrib 漏傳遞 [key] 欄位&欄位值
最近在搜尋 Dapper 的資料時,有看到一個有趣的 Dapper 擴充,
Dapper.Contrib 這是一款將 Dapper 做出基本 CRUD ,
然後當然就是做一點小 Sample 就踩到雷了 XDD
功能列表
T Get<T>(id);
IEnumerable<T> GetAll<T>();
int Insert<T>(T obj);
int Insert<T>(Enumerable<T> list);
bool Update<T>(T obj);
bool Update<T>(Enumerable<T> list);
bool Delete<T>(T obj);
bool Delete<T>(Enumerable<T> list);
bool DeleteAll<T>();
它透過了 Reflection 幫忙產出 基本CRUD ,
雖然我也是先這樣幹完之後,才發現有這擴充套件可以使用,
既然人家有實作了,就不要重複造輪子了 (就是懶)
在Dapper.Contrib中,它所預設判斷 Id 或是 使用 [key] 標記出來的欄位,
都視為 auto generated (自動產生) 的欄位,這讓我在實驗 Insert 的時候遇到有趣的事情 。
請往下看圖說故事 : P
狀況
在測試Insert的時候遇到了一點小狀況,
明明看起來有塞 Id 的值為什麼會出錯呢?
下圖是使用 SQL Profiler 錄下程式傳進去的 SQL 指令
這種時候當然要拜一下 google 大神,
最後查到了相關的 issue https://github.com/StackExchange/dapper-dot-net/issues/351
所以它是不會組進去Insert 的 SQL中 。
解法
解法其實很簡單,
因應這種狀況其實已經有解法可以處理,
但是它沒有在Demo 頁面中出現 Q_Q
所以我一度以為它是一個地雷。
將預設默認的 Id 或 自行標註 [key]的欄位,更改為[ExplictKey]就可以解決這個問題了 ~~ ^^
使用方法跟範例一樣僅需修改 POCO的 attribute
我們可以透過 SQL Profiler 來看一下修改之後傳遞進去的 SQL
這樣就可以正常新增了 : P
後記
已經好久沒有寫部落格了呢,
最近研究所與工作的事情開始兩面夾攻,
導致隔了超久才發文,
最近也該開始找回紀錄的熱情了,
慢慢整理一些東西再跟大家分享,
謝謝大家的瀏覽囉 XD