Добавить в корзинуПозвонить
Найти в Дзене
c3n9

Генерация моделей и настройка кода с помощью T4 в Avalonia + Entity Framework Core

При работе с Avalonia и Entity Framework Core (EF Core) часто требуется вручную редактировать сгенерированные модели, добавляя аннотации [JsonIgnore] к навигационным свойствам, чтобы избежать проблем с сериализацией в JSON. Однако, если моделей много, делать это вручную неудобно.
Решением является использование T4-шаблона – мощного инструмента автоматической генерации кода. T4 (Text Template Transformation Toolkit) позволяет автоматически изменять код перед его компиляцией. В нашем случае он: Это особенно полезно, если вы обновляете модели через dotnet ef dbcontext scaffold, так как при каждом обновлении EF Core перезаписывает файлы. Перед началом работы установим нужные пакеты NuGet: dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL Для работы с Entity Framework Core и генерации моделей из базы данных необходимо установить глобальный инструмент dotnet-ef. Выполните следующую команду: dotnet tool install --global dotnet-ef
Оглавление

1. Введение

При работе с Avalonia и Entity Framework Core (EF Core) часто требуется вручную редактировать сгенерированные модели, добавляя аннотации [JsonIgnore] к навигационным свойствам, чтобы избежать проблем с сериализацией в JSON. Однако, если моделей много, делать это вручную неудобно.
Решением является использование
T4-шаблона – мощного инструмента автоматической генерации кода.

T4 (Text Template Transformation Toolkit) позволяет автоматически изменять код перед его компиляцией. В нашем случае он:

  • Находит файлы моделей.
  • Определяет навигационные свойства (public virtual).
  • Добавляет к ним [JsonIgnore], если его еще нет.
  • Вставляет using Newtonsoft.Json;, если он отсутствует.

Это особенно полезно, если вы обновляете модели через dotnet ef dbcontext scaffold, так как при каждом обновлении EF Core перезаписывает файлы.

2. Установка необходимых пакетов

Перед началом работы установим нужные пакеты NuGet:

dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
  • Microsoft.EntityFrameworkCore.Design – для генерации моделей.
  • Npgsql.EntityFrameworkCore.PostgreSQL – для работы с PostgreSQL.

3. Генерация моделей

Для работы с Entity Framework Core и генерации моделей из базы данных необходимо установить глобальный инструмент dotnet-ef. Выполните следующую команду:

dotnet tool install --global dotnet-ef

Теперь создадим модели, используя dotnet ef dbcontext scaffold:

dotnet ef dbcontext scaffold "Host=0.0.0.0;Username=postgres;Password=password;Database=DataBaseName" Npgsql.EntityFrameworkCore.PostgreSQL --output-dir <Folder where you want to generate classes> --force
  • --output-dir указывает, куда сохранять файлы моделей.
  • --force позволяет перезаписать существующие модели, если они уже есть.

4. Создание T4-шаблона

Чтобы автоматизировать добавление [JsonIgnore], создадим T4-шаблон.

4.1. Добавляем T4 в проект

  1. В Visual Studio создаем новый файл Text Template (.tt).
  2. Вставляем в него следующий код:
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".txt" #>
// Нужно к стандартным добавить следующее
<#@ output extension=".cs" #>
<#@ assembly name="System.IO" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Text.RegularExpressions" #>
<#@ assembly name="System.Text.RegularExpressions" #>
<#
var directoryPath = @"C:\Users\manakov\source\repos\Test\Test\Models";
var files = Directory.GetFiles(directoryPath, "*.cs");
foreach (var file in files)
{
var fileContent = File.ReadAllText(file);
// Добавление using и JsonIgnore для свойств
if (!fileContent.StartsWith("using Newtonsoft.Json;"))
fileContent = "using Newtonsoft.Json;\n" + fileContent;
fileContent = Regex.Replace(fileContent, @"public\s+virtual\s+(\w+\??)\s+(\w+)\s*\{",
match => fileContent.Contains($"[JsonIgnore] {match.Value}") ? match.Value : $"[JsonIgnore] {match.Value}");
File.WriteAllText(file, fileContent);
}
#>

4.2. Как работает этот код?

  1. Определяет папку с моделямиdirectoryPath содержит путь к папке с .cs-файлами моделей.
  2. Читает каждый файлFile.ReadAllText(file) загружает содержимое модели.
  3. Добавляет using Newtonsoft.Json;Проверяет, есть ли using Newtonsoft.Json;, и если нет — добавляет.
  4. Ищет навигационные свойстваpublic virtual означает, что свойство связано с другой моделью.
    Если [JsonIgnore] еще нет, он добавляется перед свойством.
  5. Перезаписывает файл с изменениями

4.3. Запуск T4-шаблона

  • В Visual Studio нажмите Ctrl + S (или правой кнопкой по .tt → Run Custom Tool).
  • Файлы моделей автоматически обновятся.

5. Использование контекста в Avalonia

В файле App.axaml.cs добавляем статический экземпляр контекста БД:

public static CrudContext DB = new CrudContext();

6. Итог

Теперь у вас есть автоматизированный процесс работы с моделями: ✅ Генерация моделей через dotnet ef dbcontext scaffold
Автоматическое добавление [JsonIgnore] в навигационные свойства
Обновление всех моделей за секунды
Готовый к использованию контекст БД

Этот подход значительно ускоряет разработку и избавляет от ручных правок при каждом обновлении моделей.

Мои соцсети

GitHub: https://github.com/c3n9

Habr: https://habr.com/ru/users/c3n9/