Я использую EF4 POCO и шаблоны UnitOfWork/repository с MVC 3. Я пытаюсь понять, как изменить новую запись, которая должна быть вставлена.
Мой сервисный метод вставки/обновления выглядит примерно так (репозиторий внедряется в конструктор сервиса через IoC):
public void UpdateData(Guid id, int newValue)
{
MyPoco poco = _repository.FirstOrDefault(p => p.Id = id);
if (poco == null)
{
poco = new Poco
{
//set properties
};
_repository.Add(poco);
}
poco.SomeFieldToUpdate = newValue;
}
И мои изменения сохраняются через мой UnitOfWork в фильтре действия UseUnitOfWorkAttribute на моем контроллере:
void IResultFilter.OnResultExecuted(ResultExecutedContext filterContext)
{
var unitOfWork = IoCFactory.Instance.CurrentContainer.Resolve<IUnitOfWork>();
unitOfWork.Commit();
}
Конечно, это прекрасно работает, если это происходит только один раз для существующих или новых данных. И он отлично работает на нескольких проходах, если он уже существует.
Но если значение Guid не существует в таблице, то он пытается выполнить несколько вставок, если это вызывается несколько раз.
Так что это моя дилемма. Я понимаю, почему это не работает, я просто не уверен, как правильно это исправить. В принципе, мне нужно как-то получить ссылку на существующий POCO в UnitOfWork и как-то обновить его. Но UnitOfWork недоступен в моем сервисе (по задумке) — и я даже не уверен, что знаю, как вытащить объект из UoW и все равно обновить его.
Я делаю это неправильно или я упускаю из виду что-то простое здесь? Или у меня есть фундаментальный недостаток в том, как я это разработал? У меня такое чувство, что я делаю это сложнее, чем должно быть.
Заранее спасибо.