2011-12-09 60 views
3

EF4.1中有沒有一種方法可以生成遵循自定義命名約定而不是完全匹配數據庫列名的實體類?EF4可以使用自定義約定從數據庫生成模型

我們開始將EF4.1用於現有項目。我們希望按照現有的駱駝案例慣例來查看我們的實體上的屬性名稱,而我們的db列不遵循這些約定。

使用DB第一,我有類似[first_name][last_name]列,我想在我的EDMX產生像FirstNameLastName模型屬性。

更新:我不想手動更新所有的名字!

回答

2

映射的關鍵是手動定義新名稱。如果你有一些可以總是從列名推斷的約定,你可以建立自定義的工具/腳本/轉換,它將自動改變你的EDMX文件(它只是XML文件,你需要改變它的CSDL部分和MSL部分)。

+0

當然,沒想到那個,只能寫一個小小的後置處理器。 –

+1

非常有幫助!謝謝!我想它是時候讓我的定製工具功夫滾動! –

1

在這裏的另一個答案我創建了一個自定義工具,並把來源放在GitHub:EdmxUpdater(免責聲明,用戶界面是可怕的)。

基本上我把所有的XSD和生成的XML序列化類型,然後寫了一些代碼來實際執行名稱更新。該項目非常粗糙,但基本上處理帕斯卡套管和從屬性中刪除下劃線。

它使用映射,所以名稱更改是冪等的。

protected override void UpdateEdmx(TEdmx edmx) 
    { 
     var scalarProperties = from esm in edmx.Runtime.Mappings.Mapping.EntityContainerMapping.EntitySetMapping 
           from etm in esm.EntityTypeMapping 
           from f in etm.MappingFragment 
           from sp in f.ScalarProperty 
           select new { ScalarProperty = sp, etm.TypeName }; 

     var mapQuery = from sp in scalarProperties 
         let item = new { sp.TypeName, sp.ScalarProperty.Name, sp.ScalarProperty.ColumnName } 
         group item by sp.TypeName into g 
         select g; 

     //build map of new entity property names 
     var map = mapQuery.ToDictionary(g => g.Key, g => g.Distinct().ToDictionary(sp => sp.Name, sp => UpdateName(sp.ColumnName))); 

     //update map property names: 
     foreach (var sp in scalarProperties) 
     { 
      sp.ScalarProperty.Name = map[sp.TypeName][sp.ScalarProperty.Name]; 
     } 

     //conceptual entities 
     foreach(var entity in edmx.Runtime.ConceptualModels.Schema.EntityType) 
     { 
      var typeName = String.Format("{0}.{1}", edmx.Runtime.ConceptualModels.Schema.Namespace, entity.Name); 
      var typeMap = map[typeName]; 

      //keys 
      foreach (var keyRef in entity.Key.PropertyRef) 
      { 
       keyRef.Name = typeMap[keyRef.Name]; 
      } 

      //conceptual properties 
      foreach (var property in entity.Property) 
      { 
       property.Name = typeMap[property.Name]; 
      } 
     } 

     var principalPropertyQuery = from association in edmx.Runtime.ConceptualModels.Schema.Association 
            let end = association.End.Where(e => e.Role == association.ReferentialConstraint.Principal.Role).Single() 
            from property in association.ReferentialConstraint.Principal.PropertyRef 
            select new { TypeName = end.Type, Property = property }; 

     var dependentPropertyQuery = from association in edmx.Runtime.ConceptualModels.Schema.Association 
            let end = association.End.Where(e => e.Role == association.ReferentialConstraint.Dependent.Role).Single() 
            from property in association.ReferentialConstraint.Dependent.PropertyRef 
            select new { TypeName = end.Type, Property = property }; 

     foreach (var property in principalPropertyQuery.Union(dependentPropertyQuery)) 
     { 
      property.Property.Name = map[property.TypeName][property.Property.Name]; 
     } 
    } 
相關問題