Эффективно определить, есть ли EF 4 POCO в ObjectSet - PullRequest
4 голосов
/ 06 июня 2010

Я впервые пробую 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 флага на самом объекте, но я пытаюсь взять упорство невежества, насколько практичны.

1 Ответ

2 голосов
/ 07 июня 2010

Попробуйте взглянуть на ObjectStateManager.TryGetObjectStateEntry Method , он хорошо описан в в этом квесте stackoverflow .

...