2014-01-14 32 views
1

比方說,我有這個User類:Dapper:是否可以自定義特定類型的特定字段的類型映射?

public class User 
{ 
    public int  ID   { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email  { get; set; } 
    public DateTime DateCreated { get; set; } 
    public DateTime LastLogin { get; set; } 
} 

,我想要映射下表:

CREATE TABLE "user" (
    "ID"   int(11) NOT NULL AUTO_INCREMENT, 
    "FirstName" varchar(45) DEFAULT NULL, 
    "LastName" varchar(45) DEFAULT NULL, 
    "Email"  varchar(255) NOT NULL, 
    "DateCreated" int(11) NOT NULL, 
    "LastLogin" int(11) NOT NULL, 
    PRIMARY KEY ("ID") 
) 

或被置於簡單的話:我想將日期時間屬性存儲爲int字段在數據庫中。但是,這是這個類/表的情況。其他類/表可能映射不同。我正在考慮將自定義轉換函數與類型或成員地圖結合使用。

是否有可能用Dapper實現這一點,如果是這樣的話?

回答

1

底線是,Dapper不支持這種設計。其核心設計原則之一是表和對象之間的1:1映射,除了列名屬性映射。

我最終提出的解決方案是將Dapper與AutoMapper結合起來,我們已經在大量使用它。在我們的Dapper DAO中,在複雜情況下,我們使用與域對象分開的實體對象並在它們之間映射。所以基本上,域和表之間的非平凡映射成爲對象到對象映射的簡單問題。

1

據我所知,Dapper目前不支持這種轉換。您可以在Dapper中使用存儲的特效,並讓proc爲您進行轉換。您也可以確保在將對象傳遞給Dapper之前完成數據/轉換。

我很懷疑爲什麼你會選擇int日期vs DateTime但是在你的數據源中......看起來不必要和過於複雜。

「總是寫下你的代碼,好像下一個維護它的人是一個知道你家庭住址的斧頭精神病患者。」

+1

這樣比較好 - 我希望這是這種類型的「普通」映射,在這種映射中使用了它的查詢。我想使用Dapper,因爲我想依賴數據訪問對象中的本地SQL控制應用程序級別,而非存儲過程。 我總是將datetime映射爲整數,除非我有充分的理由不這樣做,因爲將datetime對象映射到MySQL中的sql datetime類型時出現臭名昭着的時區不匹配錯誤。 維護我的代碼的人是一位知道我住在哪裏的心理學家。儘管他並不擁有斧頭。 –

+1

@AmirAbiri沒有違法意圖,但TimeZone不匹配錯誤是程序員的錯,而不是ORM。將所有內容存儲爲UTC並計算顯示器的本地時間,並且可以避免任何數據源中的問題。如果您唯一的理由不是關注時區,請將您的日期時間存儲爲日期時間。 – Haney

+1

沒有采取 - 程序員錯誤是我想要避免的。作爲架構師,任何設計的考慮因素之一就是開發人員是否或多或少都有錯誤傾向。 我不是在責怪ORM,我只是試圖以某種方式使用它。以UTC存儲所有內容並對其進行精確控制*完全是我想要自定義轉換功能的原因。無論如何,重點不在於進行哲學辯論 - 我們可以同意不同意。問題是這是否可以與Dapper一起使用? –

1

也許您可以使用新的SqlMapper.SetTypeMap方法來實現此目的。有關更多信息,請參閱https://stackoverflow.com/a/12615036/331281

+0

除非我錯了,'SetTypeMap '可以用來調整列映射到屬性的方式,而不是如何執行類型轉換。 – Iain

0

現在應該可以使用自定義SqlMapper.TypeHandler。請參閱單元測試中的this示例。 不足之處在於,它將自定義類型處理應用於所有相同類型的字段。在你的情況下,所有的DateTime屬性將通過類型處理程序進行評估。

相關問題