Entity Framework 4 Репозиторий POCO CRUD - Как выполнить Smart INSERT / UPDATE? - PullRequest
1 голос
/ 27 сентября 2010

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

Если у меня есть репозиторий 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 Repos? Должен ли я сначала сделать запрос к БД, чтобы узнать, есть ли он, если нет, то сделать AddObject, если он есть - что мне делать?

1 Ответ

1 голос
/ 28 сентября 2010

Так что мне нужно было делать 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();
...