2

はここの状況だ:StoreGeneratedPattern T4 EntityFrameworkの懸念

私は、SQL Server 2008 R2を使用して、SQLレプリケーションは、Visual Studio 2010には、EntityFramework 4、C#4

コースのアクション私たちのDBAからはにありますSQLレプリケーション用のrowguid列を使用して、セットアップで作業してください。これらの列では、StoreGeneratedPatternプロパティをこれらの列のすべてでComputedに設定する必要があります。

問題:T4テンプレートは、(例えば、我々はデータベースからそれを更新したとき)、私はEDMX XMLに手動で移動する必要があり、当社のEDMX(ADO.NETエンティティデータモデル)ファイルを再生成

たびにファイルを使用して、このプロパティをすべてのプロパティに追加します。それはここから行くことがあります。これに

<Property Name="rowguid" Type="uniqueidentifier" Nullable="false" /> 

<Property Name="rowguid" Type="uniqueidentifier" Nullable="false" StoreGeneratedPattern="Computed"/> 

ソリューション:

私はADO.NET EntityObjectジェネレーターT4ファイルをカスタマイズする方法を見つけようとしていますStoreGeneratedPattern =私が持っているすべてのrowguidに "Computed"を生成します。

私はかなりT4に慣れています。たとえば、List.ttのようなASP.NET MVC 2用のAddViewとAddController T4テンプレートのカスタマイズのみでした。

私はEF T4ファイルを見てきましたが、私はそれを(そしてどのように)できるのか、このモンスターを通して見つけることはできません。

私の最高の推測では、ファイルのこの部分のどこかにある、元ADO.NET EntityObjectジェネレーターT4ファイルの618行544:

//////// 
    //////// Write PrimitiveType Properties. 
    //////// 
    private void WritePrimitiveTypeProperty(EdmProperty primitiveProperty, CodeGenerationTools code) 
    { 
     MetadataTools ef = new MetadataTools(this); 
#> 

    /// <summary> 
    /// <#=SummaryComment(primitiveProperty)#> 
    /// </summary><#=LongDescriptionCommentElement(primitiveProperty, 1)#> 
    [EdmScalarPropertyAttribute(EntityKeyProperty=<#=code.CreateLiteral(ef.IsKey(primitiveProperty))#>, IsNullable=<#=code.CreateLiteral(ef.IsNullable(primitiveProperty))#>)] 
    [DataMemberAttribute()] 
    <#=code.SpaceAfter(NewModifier(primitiveProperty))#><#=Accessibility.ForProperty(primitiveProperty)#> <#=code.Escape(primitiveProperty.TypeUsage)#> <#=code.Escape(primitiveProperty)#> 
    { 
     <#=code.SpaceAfter(Accessibility.ForGetter(primitiveProperty))#>get 
     { 
<#+    if (ef.ClrType(primitiveProperty.TypeUsage) == typeof(byte[])) 
       { 
#> 
      return StructuralObject.GetValidValue(<#=code.FieldName(primitiveProperty)#>); 
<#+ 
       } 
       else 
       { 
#> 
      return <#=code.FieldName(primitiveProperty)#>; 
<#+ 
       } 
#> 
     } 
     <#=code.SpaceAfter(Accessibility.ForSetter((primitiveProperty)))#>set 
     { 
<#+ 
     if (ef.IsKey(primitiveProperty)) 
      { 
       if (ef.ClrType(primitiveProperty.TypeUsage) == typeof(byte[])) 
       { 
#> 
      if (!StructuralObject.BinaryEquals(<#=code.FieldName(primitiveProperty)#>, value)) 
<#+ 
       } 
       else 
       { 
#> 
      if (<#=code.FieldName(primitiveProperty)#> != value) 
<#+ 
       } 
#> 
      { 
<#+ 
     PushIndent(CodeRegion.GetIndent(1)); 
      } 
#> 
      <#=ChangingMethodName(primitiveProperty)#>(value); 
      ReportPropertyChanging("<#=primitiveProperty.Name#>"); 
      <#=code.FieldName(primitiveProperty)#> = StructuralObject.SetValidValue(value<#=OptionalNullableParameterForSetValidValue(primitiveProperty, code)#>); 
      ReportPropertyChanged("<#=primitiveProperty.Name#>"); 
      <#=ChangedMethodName(primitiveProperty)#>(); 
<#+ 
     if (ef.IsKey(primitiveProperty)) 
      { 
     PopIndent(); 
#> 
      } 
<#+ 
      } 
#> 
     } 
    } 
    private <#=code.Escape(primitiveProperty.TypeUsage)#> <#=code.FieldName(primitiveProperty)#><#=code.StringBefore(" = ", code.CreateLiteral(primitiveProperty.DefaultValue))#>; 
    partial void <#=ChangingMethodName(primitiveProperty)#>(<#=code.Escape(primitiveProperty.TypeUsage)#> value); 
    partial void <#=ChangedMethodName(primitiveProperty)#>(); 
<#+ 
    } 

任意の助けいただければ幸いです。前もって感謝します。

編集:誰かがこれを自動化するアイデアがあれば、本当に感謝します。

答えて

0

これは多くのことを明確にします:Known issues with StoreGeneratedPattern

+1

これはかなり私は毎回手動で行う必要がありますどのような詳細に説明します。ポイントは、私はこのステップを自動化したい、私はT4が行く方法だと思ったが、まだこれを行うためのより良い方法を見つけることができませんでした... 私は少し悲しいEF4がうまく動作しない生成されたキー(GUIDまたはAUTO-INT)を使用して、次のバージョンのEFでこれが修正されることを期待しています。 一方、私はまだ自動化された回避策を探しています。 – LoganWolfer

0

このテンプレートは、C#コードの生成を担当します。モデルのXML生成には影響しません。
Storage regenerationの問題については、Microsoftにお問い合わせください。

関連する問題