我只是在使用CTP5 for 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”上的属性)来使这不仅仅是编译而且还可以工作? :o)
我希望有人有一个聪明的伎俩来解决这个问题。备选解决方案是受欢迎的,但请记住,整个想法是避免为每个枚举属性调用Map.Ignore。
答案 0 :(得分:1)
问题在于P是PropertyInfo对象。该类具有关于属性的元数据,但对于在各种对象上分配给属性的值一无所知。您必须手动创建一个Expression对象,以便通过利用您可以从P获得的属性名称来传入Ignore方法。
答案 1 :(得分:1)