Dapperを使用してエンティティをSQLServerCEにマップしています。withを保存するDateTime
とKind=Utc
、それを読み返すとDateTime
withKind=Unspecified
が表示され、あらゆる種類の問題が発生します。
例:
var f = new Foo { Id = 42, ModificationDate = DateTime.UtcNow };
Console.WriteLine("{0} ({1})", f.ModificationDate, f.ModificationDate.Kind);
connection.Execute("insert into Foo(Id, ModificationDate) values(@Id, @ModificationDate)", f);
var f2 = connection.Query<Foo>("select * from Foo where Id = @Id", f).Single();
Console.WriteLine("{0} ({1})", f2.ModificationDate, f2.ModificationDate.Kind);
このコードは次の出力を提供します。
20/09/2012 10:04:16 (Utc)
20/09/2012 10:04:16 (Unspecified)
を使用する必要があることはわかってDateTimeOffset
いますが、残念ながらSQLCEはこのタイプをサポートしていません。
回避策はありますか?すべての日付にあると仮定するようにDapperに指示できますDateTimeKind.Utc
か?そして、より一般的には、マッピングをカスタマイズするための私のオプションは何ですか?
編集:私の現在の回避策は、Dapperが結果を具体化した後に日付にパッチを適用することですが、それは一種のにおいがします...
var results = _connection.Query<Foo>(sql, param).Select(PatchDate);
...
static Foo PatchDate(Foo f)
{
if (f.ModificationDate.Kind == DateTimeKind.Unspecified)
f.ModificationDate = DateTime.SpecifyKind(f.ModificationDate, DateTimeKind.Utc);
return f;
}