状況は次のとおりです。
SQL Server 2008 R2、SQL レプリケーション、Visual Studio 2010、EntityFramework 4、C# 4 を使用しています。
DBA からの一連のアクションは、SQL レプリケーションの rowguid 列を使用してセットアップを処理することです。これらの列では、すべての列で StoreGeneratedPattern プロパティを Computed に設定する必要があります。
問題 :
T4 テンプレートが EDMX (ADO.NET エンティティ データ モデル) ファイルを再生成するたびに (たとえば、データベースから更新するとき)、EDMX XML ファイルに手動で移動して、このプロパティをすべてのファイルに追加する必要があります。これから行く必要があります:
<Property Name="rowguid" Type="uniqueidentifier" Nullable="false" />
これに:
<Property Name="rowguid" Type="uniqueidentifier" Nullable="false" StoreGeneratedPattern="Computed"/>
ソリューション :
ADO.NET EntityObject Generator T4 ファイルをカスタマイズして、所有しているすべての rowguid に StoreGeneratedPattern="Computed" を生成する方法を見つけようとしています。
私は T4 にかなり慣れていません。たとえば、List.tt のように、ASP.NET MVC 2 の AddView および AddController T4 テンプレートをカスタマイズしただけです。
私は EF T4 ファイルを調べましたが、この怪物を通してどこでそれを行うことができるか (およびその方法) を見つけることができないようです。
私の最善の推測は、ファイルのこの部分、元の ADO.NET EntityObject Generator T4 ファイルの 544 行目から 618 行目です。
////////
//////// 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)#>();
<#+
}
どんな助けでも大歓迎です。前もって感謝します。
編集 : この問題に対する答えはまだ見つかりませんでした。誰かがこれを自動化するアイデアを持っている場合は、本当に感謝しています。