我有一个修改过的T4模板,它可以从我的edmx构建类,并且除了派生类之外它还能顺利运行。
Product : BaseItem // works fine as do all top level classes
TranslatedProduct : Product : BaseItem // dang
我对如何以及在何处有条件地将T4模板设置为忽略感到困惑:在派生类的情况下使用BaseItem - 即
TranslatedProduct : Product
例如:
<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#> : BaseItem
在我脑海中,我想象它 -
if(code.Escape(entity.BaseType).Equals(string.empty)
{
<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#> : BaseItem
}
else
{
<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#>
}
但是我收到了语法错误,所以我想看看是否还有其他人试过这个,如果我走的是正确的道路
答案 0 :(得分:11)
您提供的硬编码: BaseItem
的脚本始终显示。这似乎破了。
原始代码是:
<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#>
这使用在:
中定义的类C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ Extensions \ Microsoft \ Entity Framework Tools \ Templates \ Includes \ EF.Utility.CS.ttinclude
<#= #>
标记之间的脚本部分只是C#表达式,这些表达式返回的字符串是内联插入的。
code.Escape
方法将返回类型名称(作为字符串)或空字符串。
code.StringBefore
将在第二个字符串(基本类型名称)之前追加第一个字符串(" : "
),但前提是第二个字符串不为null或为空。
要做你想要完成的事情,你可以使用他们使用的相同技巧,但相反。遗憾的是,您无法使用现有的类,因为它们没有某种AppendIfNotDefined
方法。所以我们只会使用更复杂的表达方式。
而不是:
code.StringBefore(" : ", code.Escape(entity.BaseType))
我们会写:
code.StringBefore(" : ",
string.IsNullOrEmpty(code.Escape(entity.BaseType))
? "BaseItem"
: code.Escape(entity.BaseType)
)
这是整条线,全都塞满了:
<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#><#=code.StringBefore(" : ", string.IsNullOrEmpty(code.Escape(entity.BaseType)) ? "BaseItem" : code.Escape(entity.BaseType))#>