Я использую EF4 POCO и шаблоны UnitOfWork / репозиторий с 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 и обновить его в любом случае.
Я ошибаюсь или я пропускаю что-то простое здесь? Или у меня есть фундаментальный недостаток в том, как я это спроектировал? У меня есть ощущение, что я могу сделать это сложнее, чем должно быть.
Заранее спасибо.