【问题标题】:StoreGeneratedPattern T4 EntityFramework concernStoreGeneratedPattern T4 EntityFramework 关注点
【发布时间】:2011-05-26 15:42:20
【问题描述】:

情况如下:

我使用 SQL Server 2008 R2、SQL 复制、Visual Studio 2010、EntityFramework 4、C# 4。

我们的 DBA 的做法是使用 rowguid 列进行 SQL 复制以与我们的设置配合使用。这些列的每一列都需要将 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 的新手,我只对 ASP.NET MVC 2 的 AddView 和 AddController T4 模板进行了自定义,例如 List.tt。

我查看了 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)#>();
<#+
    }

任何帮助将不胜感激。提前致谢。

编辑:还没有找到这个问题的答案,如果有人有想法自动化这个,将不胜感激。

【问题讨论】:

标签: sql-server c#-4.0 entity-framework-4 t4 database-replication


【解决方案1】:

此模板负责 C# 代码生成。它不会影响模型 XML 的生成。
尝试就存储重新生成问题与 Microsoft 联系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    相关资源
    最近更新 更多