当结果集有未映射的列时,如何使Dapper.NET抛出?

wls*_*ill 12 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;
}
Run Code Online (Sandbox Code Playgroud)

Hen*_*ema 5

您可以在使用Dapper的地方创建自己的类型映射,DefaultTypeMap并在找不到成员时抛出异常:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

缺点是您必须为每个实体配置所有类型映射:

SqlMapper.SetTypeMap(typeof(CustomerRecord), typeof(ThrowWhenNullTypeMap<CustomerRecord>));
Run Code Online (Sandbox Code Playgroud)

但是,可以使用反射进行配置。