Я использую заглушку "метод" для обновления моих POCO (используется в отсоединенном контексте, ASP.NET MVC).
Это код, который у меня сейчас есть в моем контроллере (который работает):
[HttpPost]
public ActionResult Edit(Review review)
{
Review originalReview = _userContentService.FindById(review.PostId) as Review;
var ctx = _unitOfWork as MySqlServerObjectContext;
ctx.ApplyCurrentValues("MyEntities.Posts", review);
_unitOfWork.Commit();
// ..snip - MVC stuff..
}
Как видите, запах кода везде. :)
Несколько моментов:
- Я использую внедрение зависимостей (на основе интерфейса) практически для всего.
- Я использую шаблон Unit of Work для абстрагирования ObjectContext и обеспечения сохранения в нескольких репозиториях.
- В настоящее время мой интерфейс IUnitOfWork имеет только 1 метод:
void Commit();
- Контроллер имеет
IUserContentService
иIUnitOfWork
впрыск через DI IUserContentService
вызываетFind
в репозиториях, которые используютObjectContext
.
Вот две вещи, которые мне не нравятся в приведенном выше коде:
- Я не хочу преобразовывать IUnitOfWork как
MySqlServerObjectContext
. - Я не хочу, чтобы Контролеру приходилось заботиться о
ApplyCurrentValues
Я в основном хочу, чтобы мой код выглядел так:
[HttpPost]
public ActionResult Edit(Review review)
{
_userContentService.Update(review);
_unitOfWork.Commit();
// ..snip - MVC stuff..
}
Любые идеи, как я могу это сделать? (или что-то подобное).
У меня уже есть сообразительность, чтобы определить имя набора сущностей на основе типа (комбинация дженериков, множественное число), так что не беспокойтесь об этом слишком сильно.
Но мне интересно, где лучше всего поставить ApplyCurrentValues
? Кажется нецелесообразным размещать его в интерфейсе IUnitOfWork
, так как это проблема постоянства (EF). По той же причине ему не место в Сервисе. Если я помещу его в свой класс MySqlServerObjectContext
(имеет смысл), откуда я буду вызывать это, поскольку ничто не имеет прямого доступа к этому классу - он вводится через DI, когда что-то запрашивает IUnitOfWork
.
Есть предположения?
ИЗМЕНИТЬ
У меня есть решение ниже, использующее метод заглушки, но проблема в том, что если я получил объект, который я обновляю заранее, он выдает исключение, заявляя, что объект с этим ключом уже существует.
Что имеет смысл, хотя я не уверен, как это решить?
Нужно ли мне «проверить, прикреплен ли объект уже, если нет, прикрепить его?»
Может ли кто-нибудь из экспертов по EF4 помочь?
ИЗМЕНИТЬ
Неважно - нашел решение, см. ответ ниже.