Dapper로 DbString을 deserialize하는 방법

c# converter dapper string

문제

DbString 나타내는 문자열을 포함하는 레코드를 deserialize하려고하면 :

class Record 
{
  public DbString Text {get; set;}
}

오류가 발생했습니다.

{"Invalid cast from 'System.String' to 'Dapper.DbString'."}

이 경우 DbString을 잘못 사용합니까?

수락 된 답변

읽기 모델에서 DbString을 사용해야하는 경우 (첫 번째 답변에 대한 설명에 설명 된대로) 문자열에서 DbString으로 매퍼를 포함 할 수 있습니다 (예 : 수업을 정의하다

public class DbStringTypeHandler : SqlMapper.TypeHandler<DbString>
{
    public override DbString Parse(object value)
    {
        if (value == null)
            return null;
        var dbStringValue = value as DbString;
        if (dbStringValue != null)
            return dbStringValue;
        var stringValue = value as string;
        if (stringValue != null)
            return new DbString { Value = stringValue };
        throw new InvalidCastException("Invalid cast from '" + value.GetType() + "' to '" + typeof(DbString) + "'.");
    }

    public override void SetValue(IDbDataParameter parameter, DbString value)
    {
        parameter.Value = value;
    }
}

다음 전화

SqlMapper.AddTypeHandler<DbString>(new DbStringTypeHandler());

검색어를 수행하기 전에

이제 "Record"클래스는 읽기 모델과 "쓰기"(즉, 매개 변수 설정) 모두에 대해 잘 작동해야합니다.

나는 이것을 SQL 서버 연결로 테스트했는데, 당신이 말하는 데이터베이스에 상관없이 "AddTypeHandler"를 호출해야하는 "SqlMapper"클래스 라고 생각 합니다. 그러나 약간의 조정이 필요합니다. 공급자에게.


인기 답변

Dapper의 아이디어는 쿼리 결과를 표준 .net 클래스로 변환하는 것입니다.

"DbString"유형은 특정 방식으로 매개 변수 값을 지정하는 데 사용되는 Dapper 클래스이며 "표준 .net"이 아닙니다.

따라서 Dapper가 어떤 유형을 매핑하려고하는지 유형을 추측하는 대신 Dapper가 매우 자주 작동하기 때문에 가장 간단한 경우부터 시작해야합니다.

귀하의 경우 귀하의 기록은 단순히

class Record 
{
    public string Text { get; set; }
}

Dapper는 합리적인 유형 변환이 처리되는지 확인하기 위해 몇 가지 작업을 수행합니다. 예를 들어 데이터베이스 필드가 int 인 경우이를 C # 유형의 int 속성 이나 long 또는 short로 매핑합니다 또는 바이트 (작은 데이터 유형으로 캐스팅 할 경우 런타임에 오버플로 예외가 발생할 위험이 있음). 요약하면, Dapper는 당신에게 좋으며 타입 맵핑에 대한 열심히 노력합니다. 일반적으로 DbString을 사용하는 것에 대해 걱정하지 않고 문자열을 기본으로 삼을 수 있으며 Dapper가 사용자를 정렬합니다!



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