Я впервые пробую EF 4 с POCO на небольшом проекте. В моей реализации репозитория я хочу предоставить метод AddOrUpdate, который будет добавлять переданный POCO в репозиторий, если он новый, иначе ничего не делать (так как обновленный POCO будет сохранен при вызове SaveChanges).
Моей первой мыслью было сделать это:
public void AddOrUpdate(Poco p)
{
if (!Ctx.Pocos.Contains<Poco>(p))
{
Ctx.Pocos.AddObject(p);
}
}
Однако это приводит к NotSupportedException
, как описано в разделе Ссылка на нескалярные переменные, не поддерживаемые (дополнительный вопрос: почему это не будет поддерживаться?)
Простое удаление части Contains
и постоянный вызов AddObject приводит к InvalidStateException
:
Объект с таким же ключом уже
существует в ObjectStateManager.
существующий объект находится в неизменном виде
государство. Объект может быть добавлен только к
ObjectStateManager снова, если это
в добавленном состоянии.
Так ясно, что EF 4 знает где-то, что это дубликат на основе ключа.
Какой чистый и эффективный способ для репозитория обновлять Pocos для нового или уже существующего объекта при вызове AddOrUpdate, чтобы последующий вызов SaveChanges () делал все правильно?
Я рассмотреть вопрос о проведении в isNew флага на самом объекте, но я пытаюсь взять упорство невежества, насколько практичны.