사용자 지정 SqlMapper.ITypeHandler - Dapper를 사용하여 열거 형 열을 문자열에 매핑

c# dapper enums orm

문제

고정 된 범위에서 어떤 종류의 상태 값을 나타내는 단일 문자열로 열을 반환하는 많은 수의 PL / SQL 저장 procs가 있습니다. 현재 작업중인 프로젝트에서이 열은 Dapper에 의해 도메인 객체의 문자열 속성에 매핑되었습니다.이 객체는 관리하기 어색하고 신뢰할 수 없으므로 열거 형으로 전환하고 싶습니다.

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() 등록은 SqlMapper.AddTypeHandler() 작동하지만 DbConnection.Query() 코드가 실행되면 'A'값을 변환 할 수 없다는 오류가 발생합니다. Enum.Parse에서 오류가 발생하여 제안합니다. Dapper가 등록되어 있음에도 불구하고 내 타입 핸들러를 실제로 호출하지 않습니다. 누구든지이 문제를 해결할 방법을 알고 있습니까?

수락 된 답변

다른 사용자가 Dapper의 github 사이트에서이 문제를보고했습니다. Dapper의 열거 형을 중심으로 고의적 인 최적화가 된 것처럼 보입니다. 따라서 매핑 코드를 변경하는 대신 데이터베이스 모델을 변경했습니다. Dapper 자체를 수정하려고 시도했지만 Dapper의 소스 코드는 지금까지 본적이없는 것처럼 최적화되어 있습니다. opcode를 사용하여 가능한 가장 효과적인 방식으로 변환을 수행했습니다. 작성 방법을 알아 내려고하지 않으려 고합니다. 거기서 바뀐다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.