결과 집합에 매핑되지 않은 열이있을 때 어떻게 Dapper.NET을 throw 할 수 있습니까?

dapper

문제

아래 예제 코드를 컨텍스트로 사용하면 ...이 쿼리를 실행하면 'Id'필드가 기본값 (int 값으로 0)으로 되돌아옵니다. 결과 집합에 내 결과 개체의 속성에 매핑되지 않는 열이있는 경우 예외가 발생하는 방식으로 실행되도록 dapper에게 말합니다. (나는이 문제가 단지 SQL 쿼리에서 여분의 'd'를 제거해야한다는 것을 이해하지만이 문제를보다 명확하게 드러내는 데 관심이있다)

나는이 주제에 대해 무엇이든 찾을 수 없었다. 이것이 Dapper와조차 가능하다면 알려주십시오.

사전에 감사드립니다 (이 문제 외에도 뛰어 들지 않은 사람을 위해 Dapper는 슬라이스 빵 이후로 가장 큰 것입니다!).

class CustomerRecord
{
    public int Id { get; set; }
    public string Name { get; set; }
}

CustomerRecord[] GetCustomerRecords()
{
    CustomerRecord[] ret;
    var sql = @"SELECT 
                 CustomerRecordId AS Idd, 
                 CustomerName as Name
                 FROM CustomerRecord";

    using (var connection = new SqlConnection(this.connectionString))
    {
        ret = connection.Query<CustomerRecord>(sql).ToArray();
    }

    return ret;
}

인기 답변

Dapper의 DefaultTypeMap 을 사용하고 멤버를 찾을 수 없을 때 예외를 throw하는 고유 한 유형 맵을 만들 수 있습니다.

public class ThrowWhenNullTypeMap<T> : SqlMapper.ITypeMap
{
    private readonly SqlMapper.ITypeMap _defaultTypeMap = new DefaultTypeMap(typeof(T));

    public ConstructorInfo FindConstructor(string[] names, Type[] types)
    {
        return _defaultTypeMap.FindConstructor(names, types);
    }

    public ConstructorInfo FindExplicitConstructor()
    {
        return _defaultTypeMap.FindExplicitConstructor();
    }

    public SqlMapper.IMemberMap GetConstructorParameter(ConstructorInfo constructor, string columnName)
    {
        return _defaultTypeMap.GetConstructorParameter(constructor, columnName);
    }

    public SqlMapper.IMemberMap GetMember(string columnName)
    {
        var member = _defaultTypeMap.GetMember(columnName);
        if (member == null)
        {
            throw new Exception();
        }
        return member;
    }
}

이 단점은 모든 엔티티에 대해 모든 유형 맵을 구성해야한다는 것입니다.

SqlMapper.SetTypeMap(typeof(CustomerRecord), typeof(ThrowWhenNullTypeMap<CustomerRecord>));

그러나 리플렉션을 사용하여 구성 할 수 있습니다.



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