ねののお庭。

かりかりもふもふ。

【C#】DapperでGuidをBINARY(16)に対応させる。

C#のGuidは16バイトです。なので個人的にはDBにも16バイトのまま入ってほしいところ。 なのでBINARY(16)とかでDBのテーブルを作るわけです。

が、DapperはデフォルトでGuidを文字列に変換するため、Guidに対応するカラムの型をBINARY(16)で作ったテーブルとやり取りすると怒られが発生します。 ではどうするかというと、自身で以下みたいなTypeHandlerを書いてあげます。

// 実際にはSqlMapper.TypeHandler<Guid?>も必要かと。
public class GuidTypeHandler : SqlMapper.TypeHandler<Guid>
{
    public override void SetValue(IDbDataParameter parameter, Guid value)
    {
        var bytes = value.ToByteArray();
        parameter.Value = bytes;
    }

    public override Guid Parse(object value) => new Guid((byte[])value);
}

で、自作したTypeHandlerを登録します。

SqlMapper.RemoveTypeMap(typeof(Guid));
SqlMapper.AddTypeHandler(new GuidTypeHandler());

Addするだけでなく、デフォルトのGuidを文字列として扱うTypeHandlerをRemoveするのを忘れないように...。