Entity Framework Code First: 如何映射私有字段?

11
有没有可能将表格列映射到类字段而不是类属性,如何实现?
你可以做到这一点:)
请按照以下链接操作:http://weblogs.asp.net/ricardoperes/archive/2013/08/22/mapping-non-public-members-with-entity-framework-code-first.aspx 这是一个常见的需求,非常有意义;我们需要使用LINQ表达式和一些反射技巧。首先,提供一个帮助函数来返回指向成员的表达式:
      public static class ExpressionHelper
      {
          public static Expression<Func<TEntity, TResult>> GetMember<TEntity, TResult>(String memberName)
          {
              ParameterExpression parameter = Expression.Parameter(typeof(TEntity), "p");
              MemberExpression member = Expression.MakeMemberAccess(parameter, typeof(TEntity).GetMember(memberName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Single());
              Expression<Func<TEntity, TResult>> expression = Expression.Lambda<Func<TEntity, TResult>>(member, parameter);
              return (expression);
          }
     }

然后,我们将其作为参数传递给StructuralTypeConfiguration.Property,并在DbContext.OnModelCreating方法上调用它:

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
      modelBuilder.Entity<Project>().Property(ExpressionHelper.GetMember<Project, Decimal>("Budget")).IsRequired();

      base.OnModelCreating(modelBuilder);
  }
1个回答

5
Entity Framework(无论是Code First还是其他方式)不支持映射到字段,只能映射到属性。 更新 正如评论中指出的那样,这些文档有点过时,但仍可能帮助任何初学者: Entity Framework Code first development Resources and Documentation 为了完整起见,这里是EF 4.1 RC中包含的链接:EF 4.1 Release Candidate Available 自CTP5以来的更改(来自上面的链接):
将“DbDatabase”重命名为“Database”。此类还移动到“System.Data.Entity”命名空间中,以及数据库初始化程序类。
将“ModelBuilder”重命名为“DbModelBuilder”,以与其他核心类对齐。
模型优先和数据库优先的验证。新的验证功能仅在CTP5中支持Code First。在RC中,验证功能将与所有三种开发工作流(模型优先,数据库优先和Code First)一起使用。
完整的Intellisense文档。由于API表面在每个版本之间都会发生显着变化,因此Feature CTP没有得到广泛记录。此版本包括完整的文档。
删除了Code First可插拔约定。可插拔约定在Feature CTP5中进行了预览,但对于此版本来说,它们的质量不足以发布。此版本仍支持默认约定的删除。
在Code First关系API中整合IsIndependent。在Feature CTP5中配置关系时,使用IsIndependent方法来标识对象模型中未公开外键属性的关系。现在通过调用Map方法来完成这项任务。HasForeignKey仍用于对象模型中公开外键属性的关系。

+1 我同意。在发布之前,我一直在寻找一个解释它的链接,但是没有找到。不管怎样,我非常确定这就是 EF 的工作方式。 - Jonathan
我已经阅读了所有这些文档。顺便说一下,它们都是旧的。新的 RC 版本甚至有一些破坏性的变化。这就是为什么我要问的原因。ef ef es - mynkow
确实存在一些重大变化,但据我所知,对字段映射的支持并不在议程之内。对于过时的文档,很抱歉,我不知道你对 EF 的了解程度,认为它们可能仍然有用。 - Sergi Papaseit
2
10x Sergi,很遗憾字段映射很快就无法实现了。我想我们会回到 NHibernate。 - mynkow
我会尝试。我想将我的集合公开为IEnumerable或AsReadonly,以便它们不会通过属性被修改。我有特殊的添加/删除方法来处理这些集合(例如触发事件)。谢谢。 - mynkow
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接