编辑 T4 模板不会更改模型上生成的代码
Editing T4 template does not change generated code on Models
我需要为使用数据库优先方法的项目覆盖或替换模型的默认构造函数。经过一些研究,我发现这个答案最适合完成我想要的:.
所以,不是专家,我去了我的 ProjectModel.edmx,在里面我发现了两个扩展名为 .tt 的文件,它们被称为 ProjectModel.Context.tt
和 ProjectModel.tt
,所以我想我需要编辑第二个。
为了了解它是如何工作的,我发现一段代码似乎生成了 class:
的构造函数
1 <#
2 var complexProperties = typeMapper.GetComplexProperties(complex);
3 var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(complex);
4
5 if (propertiesWithDefaultValues.Any() || complexProperties.Any())
6 {
7 #>
8 public <#=code.Escape(complex)#>()
9 {
10 <#
11 foreach (var edmProperty in propertiesWithDefaultValues)
12 {
13 #>
14 this.<#=code.Escape(edmProperty)#> = <#=typeMapper.CreateLiteral(edmProperty.DefaultValue)#>;
15 <#
16 }
17
18 foreach (var complexProperty in complexProperties)
19 {
20 #>
21 this.<#=code.Escape(complexProperty)#> = new <#=typeMapper.GetTypeName(complexProperty.TypeUsage)#>();
22 <#
23 }
24 #>
25 Init();
26 }
27
28 partial void Init();
29
30 <#
31 }
我添加了第 25 行和第 28 行,只是为了通过调用 Init() 生成模型并在之后声明方法。
现在,我转到 ProjectModel.edmx
,它显示了我的数据库图表,我右键单击图表并 运行 从数据库更新模型... 在菜单中。然后我转到 Refresh 选项卡并突出显示 Tables 并单击 Finish。我原以为新生成的文件与此类似:
namespace Project.Models.DB
{
using System;
using System.Collections.Generic;
public partial class Class1
{
public Class1()
{
this.Events = new HashSet<Event>();
Init();
}
partial void Init();
public int id { get; set; }
public string name { get; set; }
public string slug { get; set; }
public bool is_active { get; set; }
public System.DateTime date_created { get; set; }
public System.DateTime date_updated { get; set; }
public virtual ICollection<Event> Events { get; set; }
}
}
但它没有用,我想知道我是否需要做其他事情或者我是否正在编辑正确的文件。任何指导将不胜感激。
您的更改位于模板的复杂类型部分。注:
5 if (propertiesWithDefaultValues.Any() || complexProperties.Any())
6 {
7 #>
8 public <#=code.Escape(complex)#>()
9 {
10 <#
查找实体的迭代,然后在那里进行编辑:
foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
fileManager.StartNewFile(entity.Name + ".cs");
BeginNamespace(code);
#>
<#=codeStringGenerator.UsingDirectives(inHeader: false)#> // This may be slightly different based on version of EF, but you get the idea
<#=codeStringGenerator.EntityClassOpening(entity)#>
{
<#
var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(entity);
var collectionNavigationProperties = typeMapper.GetCollectionNavigationProperties(entity);
var complexProperties = typeMapper.GetComplexProperties(entity);
if (propertiesWithDefaultValues.Any() || collectionNavigationProperties.Any() || complexProperties.Any())
{
#>
public <#=code.Escape(entity)#>()
{
// ... much later
foreach (var complexProperty in complexProperties)
{
#>
this.<#=code.Escape(complexProperty)#> = new <#=typeMapper.GetTypeName(complexProperty.TypeUsage)#>();
<#
}
#>
}
Init();
}
partial void Init();
我需要为使用数据库优先方法的项目覆盖或替换模型的默认构造函数。经过一些研究,我发现这个答案最适合完成我想要的:
所以,不是专家,我去了我的 ProjectModel.edmx,在里面我发现了两个扩展名为 .tt 的文件,它们被称为 ProjectModel.Context.tt
和 ProjectModel.tt
,所以我想我需要编辑第二个。
为了了解它是如何工作的,我发现一段代码似乎生成了 class:
的构造函数 1 <#
2 var complexProperties = typeMapper.GetComplexProperties(complex);
3 var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(complex);
4
5 if (propertiesWithDefaultValues.Any() || complexProperties.Any())
6 {
7 #>
8 public <#=code.Escape(complex)#>()
9 {
10 <#
11 foreach (var edmProperty in propertiesWithDefaultValues)
12 {
13 #>
14 this.<#=code.Escape(edmProperty)#> = <#=typeMapper.CreateLiteral(edmProperty.DefaultValue)#>;
15 <#
16 }
17
18 foreach (var complexProperty in complexProperties)
19 {
20 #>
21 this.<#=code.Escape(complexProperty)#> = new <#=typeMapper.GetTypeName(complexProperty.TypeUsage)#>();
22 <#
23 }
24 #>
25 Init();
26 }
27
28 partial void Init();
29
30 <#
31 }
我添加了第 25 行和第 28 行,只是为了通过调用 Init() 生成模型并在之后声明方法。
现在,我转到 ProjectModel.edmx
,它显示了我的数据库图表,我右键单击图表并 运行 从数据库更新模型... 在菜单中。然后我转到 Refresh 选项卡并突出显示 Tables 并单击 Finish。我原以为新生成的文件与此类似:
namespace Project.Models.DB
{
using System;
using System.Collections.Generic;
public partial class Class1
{
public Class1()
{
this.Events = new HashSet<Event>();
Init();
}
partial void Init();
public int id { get; set; }
public string name { get; set; }
public string slug { get; set; }
public bool is_active { get; set; }
public System.DateTime date_created { get; set; }
public System.DateTime date_updated { get; set; }
public virtual ICollection<Event> Events { get; set; }
}
}
但它没有用,我想知道我是否需要做其他事情或者我是否正在编辑正确的文件。任何指导将不胜感激。
您的更改位于模板的复杂类型部分。注:
5 if (propertiesWithDefaultValues.Any() || complexProperties.Any())
6 {
7 #>
8 public <#=code.Escape(complex)#>()
9 {
10 <#
查找实体的迭代,然后在那里进行编辑:
foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
fileManager.StartNewFile(entity.Name + ".cs");
BeginNamespace(code);
#>
<#=codeStringGenerator.UsingDirectives(inHeader: false)#> // This may be slightly different based on version of EF, but you get the idea
<#=codeStringGenerator.EntityClassOpening(entity)#>
{
<#
var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(entity);
var collectionNavigationProperties = typeMapper.GetCollectionNavigationProperties(entity);
var complexProperties = typeMapper.GetComplexProperties(entity);
if (propertiesWithDefaultValues.Any() || collectionNavigationProperties.Any() || complexProperties.Any())
{
#>
public <#=code.Escape(entity)#>()
{
// ... much later
foreach (var complexProperty in complexProperties)
{
#>
this.<#=code.Escape(complexProperty)#> = new <#=typeMapper.GetTypeName(complexProperty.TypeUsage)#>();
<#
}
#>
}
Init();
}
partial void Init();