Репозиторий Entity Framework 4 POCO CRUD — как выполнить Smart INSERT/UPDATE?

Это может быть простое решение, но....

Если у меня есть репозиторий Entity Framework 4, который предоставляет следующий интерфейс:

void InsertOrUpdate(Foo foo);

И мой EDM выполняется с помощью пользовательских POCO (без генерации кода), как мне выполнить ОБНОВЛЕНИЕ для POCO?

Я могу ВСТАВИТЬ новый объект, выполнив следующие действия:

var newFoo = new Foo { ... };
repo.InsertOrUpdate(newFoo);

Это работает, если я реализую этот метод с помощью ObjectContext.AddObject.

Но если я попытаюсь ОБНОВИТЬ объект:

var existingFoo = repo.Find(foo);
existingFoo.Name = "Changed the foo!";
repo.InsertOrUpdate(existingFoo);

Я получаю сообщение об ошибке, говорящее о том, что объект с таким же ключом уже существует, что имеет смысл, но я думал, что метод ObjectContext.AddObject был достаточно умен, чтобы выполнить INSERT или UPDATE?

Как мы обрабатываем вставки и обновления в репозиториях EF4 POCO? Должен ли я сначала сделать запрос к БД, чтобы увидеть, есть ли он там, если его нет, то сделать AddObject, если да - что мне делать?


person RPM1984    schedule 27.09.2010    source источник


Ответы (1)


Поэтому мне нужно было сделать SaveChanges в DataContext, а не AddObject при выполнении обновления.

У меня уже был метод под названием Commit, доступный через мой интерфейс DataContext, который выполняет SaveChanges.

Я переименовал метод InsertOrUpdate в Добавить.

Итак, теперь, чтобы ВСТАВИТЬ новую сущность:

var newFoo = new Foo { ... };
repo.Add(newFoo);

для ОБНОВЛЕНИЯ существующего объекта:

var existingFoo = repo.Find(foo);
existingFoo.Name = "Changed the foo!";
myCtx.Commit();
person RPM1984    schedule 28.09.2010