簡體   English   中英

使用自定義SqlMapper.ITypeHandler將Dum映射到字符串列 - Dapper

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM