【发布时间】:2011-03-13 05:35:05
【问题描述】:
我只是深入研究将代码优先与 CTP5 一起用于实体框架。为了减轻配置数据库映射的痛苦,我自己创建了一个小助手类作为任何自定义映射的基类,但我无法弄清楚如何使方法中的最后一条语句起作用。
我正在查找 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。
【问题讨论】:
-
我仍在寻找解决此问题的有效解决方案,因为下面给出的答案只是一个指向方向的指针,但并未涉及构建正确的表达方式。
标签: c# entity-framework code-first entity-framework-ctp5 ef-code-first