Obter DateTime como UTC com Dapper
Estou usando o Dapper para mapear minhas entidades para o SQL Server CE. Se eu salvar umDateTime
comKind=Utc
, quando eu li de volta eu recebo umDateTime
comKind=Unspecified
, o que leva a todos os tipos de problemas.
Exemplo:
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);
Este código fornece a seguinte saída:
20/09/2012 10:04:16 (Utc)
20/09/2012 10:04:16 (Unspecified)
Eu sei que deveria estar usando umDateTimeOffset
, mas, infelizmente, o SQL CE não tem suporte para esse tipo.
Existe uma solução alternativa? Posso dizer ao Dapper para assumir que todas as datasDateTimeKind.Utc
? E, mais geralmente, quais são minhas opções para personalizar o mapeamento?
EDIT: Minha solução atual é para corrigir as datas após Dapper materializou o resultado, mas isso cheira meio ...
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;
}