Использование шаблонов T4 для генерации нескольких классов на основе POCO

Я ищу способ повысить производительность, когда я добавляю таблицу в свою базу данных. Обычно, когда я добавляю новую таблицу, я должен выполнить следующие шаги.

Добавить таблицу в базу данных (просто)Создайте соответствующий класс EF Code First. (Я не использую миграции БД)Создайте модель POCO, соответствующую классу EF, созданному в # 2.Создать класс репозиторияСоздание команд и обработчиков для шаблона CQRSСоздание карт AutoMapper для вновь создаваемых классов

Недавно я создал новый веб-сайт, где требовалось сначала использовать базу данных EF, и я увидел, как она использует файлы tt для генерации классов. Это заставило меня задуматься, что я могу каким-то образом использовать эти шаблоны (новые) для генерации всех стандартных элементов поддержки для основных операций CRUD. Проблема в том, что у меня нет опыта создания этих шаблонов, и я не знаю, с чего начать.

Образец кода, который будет сгенерирован:

вместилище

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public interface IUsersRepository : IRepository<Users>
{
}

public class UsersRepository : RepositoryBase<Users>, IUsersRepository
{
    public UsersRepository(IDatabaseFactory databaseFactory)
        : base(databaseFactory)
    {
    }

}

Базовая модель на основе сущности, сгенерированной из EDMX (или Code First)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class User 
{
    public int UserId { get; set; }
    public string UserRole { get; set; }
    public string UserName { get; set; }
}

команда

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class AddUpdateUserPayoutCommand : CommandBase, ICommand
{
    public int UserId { get; set; }
    public string UserRole { get; set; }
    public string UserName { get; set; }
}

Обработчик команд

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class AddUpdateUserHandler: ICommandHandler<AddUpdateUserCommand>
{
    private readonly IUsersRepository _repository;
    private readonly IUnitOfWork _unitOfWork;
    public AddUpdateUserPayoutHandler(IUsersRepository repository, IUnitOfWork unitOfWork)
    {
        _repository = repository;
        _unitOfWork = unitOfWork;
    }
    public ICommandResult Execute(AddUpdateUserCommand command)
    {
        Users entity;
        if (command.UserId == 0)
        {
            entity = AutoMapper.Mapper.Map<Users>(command);
            _repository.Add(entity);
        }
        else
        {
            entity = _repository.Get(x=>x.UserId==command.UserId);
            entity = AutoMapper.Mapper.Map<Users>(command);
            _repository.Update(entity);
        }
        _unitOfWork.Commit(command.UserId);         

        return new CommandResult(true,entity.UserId);
    }
}

Карты Automapper - размещены в app_start

Mapper.CreateMap<User, AddUpdateUserCommand>();

Ответы на вопрос(2)

Ваш ответ на вопрос