代替任何人回答这个问题,并希望帮助像我这样的其他新手,以下是我创建 T4 转换 DTOclasses.tt 所做的工作,它仅生成简单的类定义。
注意:这并不是替换 .edmx 的 .tt 文件,而是在 .edmx 模板生成 .edmx 文件后运行。 (我不想更改用于生成域模型的任何代码)。
视觉工作室 2015
实体框架6.0
.NET框架4.6.1
♦ Notes on Creating DTOclassess.tt
This T4 transform was created by first copying the working transform used to build the entity model, MedicalOfficeModel.tt.
Then, parts of it that were not needed for creation of POCO classes to be used for DTO's (data transfer objects) were removed.
♦ Changes made to DTOclassses.tt
• Adding "DTO" to namespace.
public void BeginNamespace(CodeGenerationTools code)
{
var codeNamespace = String.Format("{0}.{1}",code.VsNamespaceSuggestion(), "DTO");
if (!String.IsNullOrEmpty(codeNamespace))
{
#>
namespace <#=code.EscapeNamespace(codeNamespace)#>
{
<#+
PushIndent(" ");
}
}
• Put all POCO classes in single file DTOclasses.cs
<#
EndNamespace(code);
}
fileManager.Process(false); <--**False stops the splitting of classes into different files. Default is true.
#>
• Change the property naming code:
public string Property(EdmProperty edmProperty)
{
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1} {2} {{ {3}get; {4}set; }}",
Accessibility.ForProperty(edmProperty),
_typeMapper.GetTypeName(edmProperty.TypeUsage),
GetPascalCase(_code.Escape(edmProperty)),
_code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
_code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}
• Change the class naming code:
public string EntityClassOpening(EntityType entity)
{
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1}partial class {2}{3}",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
GetPascalCase(_code.Escape(entity)),
_code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));
}
• Removed all the navigational stuff. Replaced everything above the helper functions (i.e., above <#+) with:
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Text.RegularExpressions" #>
<#@ include file="EF6.Utility.CS.ttinclude" #>
<#@ output extension=".cs" #>
<#
const string inputFile = @"MedicalOfficeModel.edmx";
var textTransform = DynamicTextTransformation.Create(this);
var code = new CodeGenerationTools(this);
var ef = new MetadataTools(this);
var typeMapper = new TypeMapper(code, ef, textTransform.Errors);
var fileManager = EntityFrameworkTemplateFileManager.Create(this);
var itemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile);
var codeStringGenerator = new CodeStringGenerator(code, typeMapper, ef);
if (!typeMapper.VerifyCaseInsensitiveTypeUniqueness(typeMapper.GetAllGlobalItems(itemCollection), inputFile))
{
return string.Empty;
}
WriteHeader(codeStringGenerator, fileManager);
foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
fileManager.StartNewFile(entity.Name + ".cs");
BeginNamespace(code);
#>
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
<#=codeStringGenerator.EntityClassOpening(entity)#>
{
<#
var simpleProperties = typeMapper.GetSimpleProperties(entity);
if (simpleProperties.Any())
{
foreach (var edmProperty in simpleProperties)
{
#>
<#=codeStringGenerator.Property(edmProperty)#>
<#
}
}
#>
}
<#
EndNamespace(code);
}
fileManager.Process(false);
#>
♦ Added my helper function:
<#+
public static string GetPascalCase(string name)
{
return Regex.Replace(name, @"^\w|_\w",
(match) => match.Value.Replace("_", "").ToUpper());
}
#>
当一切完成后,它可以完美运行(在 VS2015 中),完全满足我的需要。 :)