2

状況は次のとおりです。

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)#>();
<#+
    }

どんな助けでも大歓迎です。前もって感謝します。

編集 : この問題に対する答えはまだ見つかりませんでした。誰かがこれを自動化するアイデアを持っている場合は、本当に感謝しています。

4

1 に答える 1

0

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

于 2010-12-17T15:03:00.040 に答える