Holen Sie sich DateTime als UTC mit Dapper
Ich verwende Dapper, um meine Entitäten SQL Server CE zuzuordnen. Wenn ich einen speichereDateTime
mitKind=Utc
Wenn ich es zurück lese, bekomme ich eineDateTime
mitKind=Unspecified
, was zu allerlei Problemen führt.
Beispiel:
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);
Dieser Code gibt die folgende Ausgabe aus:
20/09/2012 10:04:16 (Utc)
20/09/2012 10:04:16 (Unspecified)
Ich weiß, ich sollte eine verwendenDateTimeOffset
Leider unterstützt SQL CE diesen Typ nicht.
Gibt es eine Problemumgehung? Kann ich Dapper sagen, dass er davon ausgehen soll, dass alle Daten vorliegenDateTimeKind.Utc
? Und im Allgemeinen: Welche Optionen stehen zur Verfügung, um das Mapping anzupassen?
BEARBEITEN: Meine aktuelle Problemumgehung besteht darin, die Daten zu patchen, nachdem Dapper das Ergebnis materialisiert hat, aber es riecht irgendwie ...
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;
}