[Dapper] Dapper.Contrib 小地雷筆記

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

簡單的說明是預設默認的 Id自行標註 [key]的欄位,都是被莫認為自動運算的欄位,

所以它是不會組進去Insert 的 SQL中 。

 

解法

解法其實很簡單,

因應這種狀況其實已經有解法可以處理,

但是它沒有在Demo 頁面中出現 Q_Q

所以我一度以為它是一個地雷。

 

將預設默認的 Id 或 自行標註 [key]的欄位,更改為[ExplictKey]就可以解決這個問題了 ~~ ^^

使用方法跟範例一樣僅需修改 POCO的 attribute

我們可以透過 SQL Profiler 來看一下修改之後傳遞進去的 SQL

這樣就可以正常新增了 : P

 

後記

已經好久沒有寫部落格了呢,

最近研究所與工作的事情開始兩面夾攻,

導致隔了超久才發文,

最近也該開始找回紀錄的熱情了,

慢慢整理一些東西再跟大家分享,

謝謝大家的瀏覽囉 XD