[英]Mapping Enum to string column with custom SqlMapper.ITypeHandler - Dapper
我有大量的PL / SQL存儲過程返回列,其中單個字符串表示固定范圍內的某種狀態值。 在我正在研究的項目中,這些列已經被Dapper映射到域對象上的字符串屬性,這些屬性管理起來很笨拙且不可靠,所以我想切換到枚舉。
如果我使用enum Foo {A, P}
類的單個字符名稱的enum Foo {A, P}
我很確定Dapper會正確映射它們但我不希望這樣,我想要帶有描述性標簽的枚舉如下:
enum Foo {
[StringValue("A")]
Active,
[StringValue("P")]
Proposed
}
在上面的例子中,StringValueAttribute是一個自定義屬性,我可以使用反射將"A"
轉換為Foo.Active
,這很好 - 除了我需要Dapper為我執行轉換邏輯。 我寫了一個自定義類型處理程序來執行此操作
public class EnumTypeHandler<T> : SqlMapper.TypeHandler<T>
{
public override T Parse(object value)
{
if (value == null || value is DBNull) { return default(T); }
return EnumHelper.FromStringValue<T>(value.ToString());
}
public override void SetValue(IDbDataParameter parameter, T value)
{
parameter.DbType = DbType.String;
parameter.Value = EnumHelper.GetStringValue(value as Enum);
}
}
//Usage:
SqlMapper.AddTypeHandler(typeof(Foo),
(SqlMapper.ITypeHandler)Activator.CreateInstance(typeof(EnumTypeHandler<>).MakeGenericType(typeof(Foo)));
使用SqlMapper.AddTypeHandler()
注冊似乎工作正常,但是當我的DbConnection.Query()
代碼運行時,我收到一條錯誤,指出無法轉換值'A' - 從Enum.Parse拋出錯誤,提示Dapper實際上並沒有調用我的類型處理程序,盡管它已被注冊。 有沒有人知道這方面的方法?
另一位用戶在Dapper的github網站上報告了這個問題。 看起來這是一個專門圍繞Dapper枚舉的故意優化,所以我改變了我的數據庫模型,而不是試圖改變映射代碼。 我看着嘗試修改Dapper本身,但Dapper的源代碼優化得像我見過的任何東西,發出操作碼以最高性能的方式執行轉換 - 我不想開始嘗試弄清楚如何制作在那里改變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.