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するのを忘れないように...。