Проблемы при маппинге enum в string
От: kekekeks  
Дата: 16.11.14 13:11
Оценка:
В БД используется постгресовский тип, созданный через 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]);
        }

и горя не знал, но теперь так нельзя.


Как бороться?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.