Эффективно определить, уже в EF 4 Poco уже в объекте
-
24-10-2019 - |
Вопрос
Я впервые пробую 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 () поступил правильные вещи?
Я подумал о том, чтобы нести флаг ISEW на самом объекте, но я стараюсь принять настойчивое невежество, насколько это практично.
Решение
Попытаться взглянуть на ObjectStateManager.trightObjectStateEntry, это хорошо описано в Этот Queston Stackoverflow.