Вопрос

Я впервые пробую 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top