Im ищет способ повысить производительность при добавлении таблицы в мою базу данных. Как правило, когда я добавляю новую таблицу, я должен выполнить следующие шаги.Использование шаблонов T4 для генерации нескольких классов на основе POCO
- Добавить таблицу в базу данных (простой)
- Создать соответствующий EF Code First класса. (я не использую миграции db)
- Создайте модель POCO, которая соответствует классу EF, созданному в # 2.
- Создать класс репозитория
- Создание команд и обработчиков для CQRS шаблон
- Создание карт AutoMapper для вновь созданных классов
Я недавно создал новый веб-сайт, где требования должны были использовать базу данных EF первым и я видел, как он использовал файлы tt для генерации классов. Это заставило меня подумать, что я могу каким-то образом использовать эти шаблоны (новые) для создания всех стандартных элементов поддержки для основных операций CRUD. Проблема в том, что у меня нет опыта создания этих шаблонов, и я понятия не имею, с чего начать.
Пример кода, которые будут созданы:
Repository
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; }
}
Command Handler
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>();
Хотя вы можете сделать это с помощью T4 (почему бы не копировать существующий шаблон T4 и не мешать изменениям?), Я не рекомендую этот подход, потому что вы закончите переписывать любые изменения, которые вы делаете эти классы POCO. Вы рассматривали несколько иной подход к архитектуре? Даже что-то вроде шаблона GenericRepository, созданного из ваших классов EF, может сэкономить много работы. –
Целью создания первого поколения всех поддерживающих классов, соответствующих требованиям к проектам. Что касается перезаписи, использование частичных классов позаботится об этой проблеме. – jason
Я думаю, вы думаете по правильной линии, если вы можете привести пример того, как код, который вы делаете вручную, будет выглядеть так, что мне легче создать что-то, что будет иметь для вас смысл. – FuleSnabel