Я просто погружаюсь в использование code-first с CTP5 для Entity Framework. Чтобы облегчить настройку сопоставлений базы данных, я создал себе небольшой вспомогательный класс, который будет служить базовым классом для любых пользовательских сопоставлений, но я не могу понять, как заставить работать последний оператор в методе.
Я нахожу все общедоступные свойства типа Enum, а затем вызываю метод .Ignore для каждого свойства, найденного в данном типе. Код использует Fasterflect для отражения и небольшой помощник ForEach, но должно быть довольно очевидно, что делает код.
internal abstract class AbstractMappingProvider<T> : IMappingProvider where T : class
{
public EntityTypeConfiguration<T> Map { get; private set; }
public virtual void DefineModel( ModelBuilder modelBuilder )
{
Map = modelBuilder.Entity<T>();
Map.ToTable( typeof(T).Name );
typeof(T).Properties( Flags.Public | Flags.Instance )
.Where( p => p.PropertyType.IsEnum )
.ForEach( p => Map.Ignore( e => p ) );
}
}
Выполнение вышеуказанного дает мне следующую ошибку:
System.InvalidOperationException:
The expression 'e => value(Domain.AbstractMappingProvider`1+<>c__DisplayClass3[Domain.User]).p' is not a valid property expression.
It must be of the form 'e => e.Property'.
Как я могу использовать «p» (который на самом деле является свойством «e»), чтобы это не только компилировалось, но и работало? :о)
Я надеюсь, что у кого-то есть хитрый трюк, чтобы решить эту проблему. Приветствуются альтернативные решения, но помните, что вся идея состоит в том, чтобы избежать вызова Map.Ignore для каждого свойства перечисления.