以下のサンプルコードをコンテキストとして使用します。このクエリを実行すると、 '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
を使用する独自の型マップを作成し、メンバーが見つからない場合は例外をスローすることができます。
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>));
ただしこれは反射を使用して構成することができます。