В БД используется постгресовский тип, созданный через CREATE TYPE, соответственно в базу должны отправляться строки.
Делаю так:
static Func<T, TResult> GetIndexer<T, TResult>(object instance)
{
return (Func<T, TResult>) Delegate.CreateDelegate(typeof (Func<T, TResult>), instance,
instance.GetType().GetProperties().First(p => p.GetIndexParameters().Length != 0).GetGetMethod());
}
static void ConfigureEnum<T>(this FluentMappingBuilder builder)
{
builder.MappingSchema.AddScalarType(typeof(T), DataType.NVarChar);
var enumToString = ((T[]) Enum.GetValues(typeof (T))).ToDictionary(x => x, x => x.ToString());
var stringToEnum = enumToString.ToDictionary(x => x.Value, x => x.Key);
builder.MappingSchema.SetConverter<T, DataParameter>(x => new DataParameter {Value = enumToString[x]});
builder.MappingSchema.SetConverter<string, T>(x => GetIndexer<string, T>(stringToEnum)(x));
}
В дальнейшем
builder.ConfigureEnum<PaymentState>()
Вставка через .Insert(new Payment(){...}) работает, а вот при попытке сделать db.GetTable<Payment>(p=>p.Id == 123, _ => new Payment {State = PaymentState.Completed}); я ловлю
A first chance exception of type 'System.ArgumentException' occurred in linq2db.dll
Additional information: Expression of type 'System.Int32' cannot be used for parameter of type 'PowerServer.Payments.PaymentState'
При попытке использования свежих исходников из github-репозитория генерится запрос, игнорирующий тот факт, что вообще были зарегистрированы какие-то конвертации:
UPDATE
"Payments"
SET
"State" = 1
WHERE
"Payments"."Id" = 150 AND "Payments"."State" = 0
Конвертеры в обоих случаях не вызываются. Раньше в BLToolkit делал
public static void ConfigureEnum <T> (this FluentMap<T> map)
{
var values = Enum.GetValues (typeof (T)).Cast<Enum> ().ToArray ();
var names = Enum.GetNames (typeof (T));
for (int i = 0; i < names.Length; i++)
map.MapValue (values[i], names[i]);
}
и горя не знал, но теперь так нельзя.
Как бороться?