情况如下:
我使用SQL Server 2008 R2,SQL Replication,Visual Studio 2010,EntityFramework 4,C#4。
我们的DBA的操作过程是使用SQL Replication的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的新手,我只对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)#>();
<#+
}
任何帮助将不胜感激。提前谢谢。
编辑:没有找到这个问题的答案,如果有人有想法自动化这个,真的很感激。答案 0 :(得分:0)
此模板负责C#代码生成。它不会影响模型XML生成 尝试就存储再生问题与Microsoft联系。