2011-03-21 93 views
7

是否有可能映射表列一類領域,而不是一類財產又如何?實體框架代碼優先:如何映射私有字段?

你能做到:)

請點擊此鏈接: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); 
      } 
    } 

然後,我們把它放在DbContext.OnModelCreating方法,作爲參數傳遞給StructuralTypeConfiguration.Property:

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

     base.OnModelCreating(modelBuilder); 
    } 

回答

4

實體框架(Code First or not)不支持映射到一個字段;只有屬性。

UPDATE 正如在評論中指出,這些文件都有點過時,但仍可能幫助任何初學者一起:

Entity Framework Code first development Resources and Documentation

爲了完整起見,繼承人鏈接什麼包含在EF 4.1 RC:EF 4.1 Release Candidate Available

的變化,因爲CTP5(從上面的鏈接):

  • 的「DbDatabase」重命名到「數據庫」。此類還將 移動到'System.Data.Entity' 命名空間,以及數據庫 初始化程序類。

  • 的重命名「模型構建器」爲「DbModelBuilder」,以與其他 核心類對齊。

  • 驗證的模型優先和數據庫優先。新的驗證 功能只在代碼 首先在CTP5支持。在RC中,驗證 功能將與全部三個 開發工作流(Model First, Database First和Code First)配合使用。

  • 完整的智能感知文檔。特徵CTP沒有被廣泛記錄在 中,因爲API表面在每個版本之間顯着變化 。 此版本包含完整 文檔。

  • 刪除Code First Pluggable Conventions。可插入約定 在Feature CTP5中進行了預覽,但 未在此 版本的上線質量。該版本仍支持 刪除默認約定。

  • 在Code First關係API中合併IsIndependent。當 配置特徵 CTP5中的關係時,使用IsIndependent方法 來識別 沒有在對象模型中公開的外鍵屬性 。現在通過調用Map方法完成 。 HasForeignKey仍用於 關係,其中外鍵 屬性在對象 模型中公開。

+0

+1我很贊同。我一直在尋找一個鏈接,在發佈前解釋它,但我沒有找到它。無論如何,我非常確定這是EF如何運作的。 – Jonathan 2011-03-21 12:51:05

+0

我已閱讀所有這些文件。順便說一句,他們是老。新的RC甚至有突破性的變化。這就是我問的原因。從現在開始 – mynkow 2011-03-21 12:57:06

+0

確實有制動器的變化,但支持映射到領域並不在議程AFAIK。對於過時的文件抱歉,不知道你的EF知識的水平,並認爲他們可能是有用的無論如何。 – 2011-03-21 13:01:19