Ich benutze Dapper, um einige Lasttest-Tools auszuprobieren, die auf eine PostgreSQL-Datenbank zugreifen müssen. Diese bestimmte Version von PostgreSQL unterstützt GUIDs nicht nativ, daher werden GUID-Werte als 32 Zeichenfolgen gespeichert. Die Werte werden unter Verwendung von someGuid.ToString("N")
in Zeichenfolgen konvertiert. Die Konvertierung zurück nach Guid kann mit Hilfe eines new Guid(stringValueFromColumn)
.
Meine Frage ist, wie bekomme ich Dapper, um die Strings zu lesen und sie in Guids umzuwandeln?
Ich habe versucht, die DbType-Zuordnung zu ändern, aber das funktioniert nicht.
Der einfachste Weg dies zu tun (ohne auf Dapper zu warten) ist eine zweite Eigenschaft:
public Guid Foo {get;set;}
public string FooString {
get { return Foo.ToString("N"); }
set { Foo = new Guid(value); }
}
Und alias die Spalte in Ihrer Abfrage als FooString
.
Natürlich wirft dies die Frage auf: Sollte man private Objekte für diese Art von Dingen unterstützen? Zu dem sage ich: wahrscheinlich.
Ich weiß, dass dies eine alte Frage ist, aber für jeden, der auf diesen Thread stößt, wie ich es heute getan habe, werde ich meine Lösung posten.
Ich verwende MySQL, aber es hat das gleiche Problem, da ich die Guid als String speichere. Um die Zuordnung zu korrigieren, ohne die Spalte zu aliasen, habe ich Folgendes verwendet:
public class MySqlGuidTypeHandler : SqlMapper.TypeHandler<Guid>
{
public override void SetValue(IDbDataParameter parameter, Guid guid)
{
parameter.Value = guid.ToString();
}
public override Guid Parse(object value)
{
return new Guid((string)value);
}
}
Und in meinem Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
SqlMapper.AddTypeHandler(new MySqlGuidTypeHandler());
SqlMapper.RemoveTypeMap(typeof(Guid));
SqlMapper.RemoveTypeMap(typeof(Guid?));
}