Редактирование шаблона T4 не изменяет сгенерированный код на моделях - PullRequest
0 голосов
/ 06 декабря 2018

Мне нужно было переопределить или заменить конструктор по умолчанию моих моделей для проекта, использующего подход базы данных в первую очередь.После некоторых исследований я нашел, что этот ответ является наиболее подходящим для достижения того, что я хотел: Переопределить или заменить конструктор по умолчанию при использовании первого подхода к базе данных .

Итак, не будучи экспертом, я пошелк моему ProjectModel.edmx и внутри я нашел два файла с расширением .tt, они назывались ProjectModel.Context.tt и ProjectModel.tt, поэтому я решил, что мне нужно отредактировать второй.

Пытаясь понять, как это работает, я нашел фрагмент кода, который, кажется, генерирует конструктор класса:

 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, который показывает диаграмму моей базы данных, я щелкнул правой кнопкой мыши по диаграммеи запустил Обновить модель из базы данных ... в меню.Затем я перешел на вкладку Обновить , выделил Таблицы и нажал Готово .Я ожидал, что новые сгенерированные файлы будут похожи на это:

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; }
    }
}

, но это не сработало, мне интересно, нужно ли мне что-то делать или я редактирую правильный файл.Любое руководство будет очень цениться.

1 Ответ

0 голосов
/ 19 декабря 2018

Ваши изменения находятся в разделе сложного типа шаблона.Примечание:

 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();
...