대퍼가 명시 적 생성자가 정의되어있는 경우 데이터베이스에서 varchar로 저장된 enum을 처리 할 수 ​​있습니까?

.net dapper enums

문제

열거 형 필드를 포함하는 클래스가 있습니다.

enum myEnum { foo, bar }

class myClass {
    ...

    public myClass(myEnum myField)
    {
        this.myField =myField;
    }
    public myEnum myField {get;set;}
}

열거 형 값은 정수가 아닌 varchars (즉 'foo', bar ')로 데이터베이스에 저장됩니다.

DapperQuery ()에서 dapper를 사용하여 객체를 채우고 싶지만 DapperQuery가 작동하도록 할 수는 없습니다. Dapper는 myClass에 적합한 생성자를 찾지 못했다고 불평합니다.

나는이 질문을 읽었으며, 내가 성취하고자하는 것이 가능해야 함을 암시하는 듯하다.하지만 나는 어떻게 (Dapper 1.38을 사용하고 있는지)

myEnum TypeHandler 를 추가하려고했지만 도움이되지 않았습니다.

후드를 보면 Dapper가 myClass 용 TypeHandler ( SqlMapper.GetDeserializer() )를 검색하고 아무 것도 찾지 못하는 것 같습니다 (내 TypeHandler 가 myEnum에 정의되어 있고 SqlMapper.FindConstructor

Findconstructor는 typeHandler에 대해 신경 쓰이는 것 같지 않습니다. 정확히 일치하는 항목을 찾고, myEnum 또는 기본 유형이 string과 동일한 유형인지 여부를 확인하고, 그렇지 않으면 null을 반환하며, 호출자가 throw합니다.

편집 : 명시 적 생성자를 제거하면 위의 코드가 작동합니다.

수락 된 답변

좋아, 알아 냈어. 기본이 아닌 생성자가 정의되어 있으면 dapper가 enum을 처리 할 수 ​​없습니다.

이는 dapper가 매개 변수없는 생성자 (자동으로 유효한 것으로 간주 됨)를 처리하는 특수한 경우를 가지므로 명시 적 생성자는 유형을 확인하고 내 varchar-enum 시나리오에서는 허용되지 않기 때문입니다.

중요한 이유는 F # 레코드 유형입니다. F # 레코드 유형은 기본 유형 이외의 생성자를 가질 수 없으므로 열거 형 멤버가 포함되어있을 때 Dapper가 제대로 처리하지 못합니다.

이 문제를 해결하기 위해 요청 을 제출했습니다.


인기 답변

OK 일하는 것 같습니다. 아래 테스트는 녹색입니다.

public enum MyTestEnum
{
    Foo,
    Bar
}

public class MyTestClass
{
    public MyTestEnum MyTestEnum { get; set; }
}

public class DapperTests
{
    [Test]
    public void EnumMappingTest()
    {
        DbConnection conn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);

        var result = conn.Query<MyTestClass>("select MyTestEnum = 'Foo'").First();

        Assert.That(result.MyTestEnum, Is.EqualTo(MyTestEnum.Foo));
    }
}


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow