I'm using Dapper to hammer out some load testing tools that need to access a PostgreSQL database. This particular version of PostgreSQL does not support GUIDs natively, so GUID values are stored as 32 character strings. The values are converted to strings using someGuid.ToString("N")
, conversion back to Guid can be done using new Guid(stringValueFromColumn)
.
My question is how do I get Dapper to read the strings and convert them back to Guids?
I tried modifying the DbType mapping but that doesn't work.
I'm using MySql but it has the same problem since I store the Guid as a string. To fix the mapping without having to alias the column i used the following:
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);
}
}
And in my Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
SqlMapper.AddTypeHandler(new MySqlGuidTypeHandler());
SqlMapper.RemoveTypeMap(typeof(Guid));
SqlMapper.RemoveTypeMap(typeof(Guid?));
}
Perhaps the simplest way to do this (without waiting on dapper) is to have a second property:
public Guid Foo {get;set;}
public string FooString {
get { return Foo.ToString("N"); }
set { Foo = new Guid(value); }
}
And in your query, alias the column as FooString
.
Of course, then this prompts the question: should dapper support private properties for this type of thing? To which I say: probably.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With