如何以通用方式使用EF4 / CTP5流畅映射排除枚举属性?

时间:2011-03-13 05:35:05

标签: c# entity-framework code-first entity-framework-ctp5 ef-code-first

我只是在使用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。

2 个答案:

答案 0 :(得分:1)

问题在于P是PropertyInfo对象。该类具有关于属性的元数据,但对于在各种对象上分配给属性的值一无所知。您必须手动创建一个Expression对象,以便通过利用您可以从P获得的属性名称来传入Ignore方法。

答案 1 :(得分:1)