Я пытаюсь создать новую основную структуру (в основном веб-сайт) с шаблоном репозитория и единицы работы для моих приложений, которые я могу изменить для своего ORM в NHibernate или Dapper позже.Entity Framework, свойства навигации, репозиторий, блок работы, сменный ORM
Сейчас мой интерфейс Единица работы, как это:
public interface IUnitOfWork : IDisposable
{
void Commit();
void Rollback();
}
И реализация Entity Framework, как это (обрезается для удобства чтения)
public class EfUnitOfWork : IUnitOfWork
{
....
public EfUnitOfWork(ApplicationDbContext context)
{
this._context = context;
this._transaction = new EfTransaction(_context.Database.BeginTransaction());
}
public void Commit()
{
this._context.SaveChanges(true);
this._transaction.Commit();
...
}
public void Rollback()
{ ...
}
}
Проблема заключается в том, что в моей службы слоя который содержит бизнес-логику, я могу сделать что-то подобное с навигационными свойствами:
public bool CreateCity(CityCreateModel model)
{
using (var uow = _unitOfWorkFactory.Create())
{
var city = new City();
city.Name = model.Name;
city.State = new State() { Country = new Country() { Name = "SomeCountry" }, Name = "SomeCity" };
_cityRepository.Create(city);
try
{
uow.Commit();
return true;
}
catch (Exception)
{
uow.Rollback();
throw;
}
}
}
Репозиторий Создать метод довольно прост, как я использую рамки сущности:
public void Create(City entity)
{
_set.Add(entity);
}
Проблема начинается здесь, когда член команды пишет код, как пример службы с использованием нового ключевого слова на навигационных свойств или добавление элементов для коллекции свойства навигации, инфраструктура сущности обнаруживает эти изменения, и когда я сохраняю изменения, они также сохраняются в базе данных.
Если я попытаюсь изменить существующий образец на Dapper.NET или на службу REST позже, может возникнуть много проблем, которые я должен был искать, для каждого свойства навигации и отслеживания, которые они были изменены или нет, и написать много (возможно, мусорного) кода для них, поскольку я действительно не знал, что вставлено в таблицу через сущность framework, и что isnt (из-за свойств навигации также вставлены и мои репозитории вызываются один раз только для 1 вставки, которая предназначена для City в моем примере выше)
Есть ли способ предотвратить это поведение или есть шаблон, известный, что я могу адаптироваться на раннем этапе, поэтому у меня не будет проблем позже?
Как вы преодолели это?
Dapper - это легкий ORM, ориентированный главным образом на отображение объектов. Entity Framework (и NHibernate) - это полномасштабные ORM. Нет никакого способа написать больше кода, если вы используете Dapper вместо EF или NHibernate. Скорее всего, Dapper не подходит для ваших требований. –
Однако, скажем, мне нужно изменить свои потребности в базе данных, и теперь я должен создавать/читать объекты из веб-службы, а не напрямую из базы данных. Я все еще не могу избежать добавления свойств навигации, я не могу контролировать, что позже будет добавлено в db/web-сервис. Ваш комментарий заставил меня понять, что я не уточнил свой вопрос, спасибо –
Тогда ваши методы репозитория и методы API должны делать то же самое. Если они не знают, как создавать объекты состояния, тогда метод службы должен заменить новое состояние() чем-то другим. Просто будьте осторожны, потому что это начинает открывать ящик Пандоры, и уровень сложности может стать довольно высоким довольно быстро. –