Как определить, является ли объект EF4 новым или уже существующим? - PullRequest
5 голосов
/ 27 октября 2010

В моем приложении есть сущность, которая используется по существу как сложный комплекс между многими из моих сущностей Пользователь и Проект. Я пытаюсь определить, как выяснить, нужно ли моему сервисному уровню добавить объект в контекст или присоединить объект (для обновления существующего объекта), и я не знаю, как это сделать.

Это легко определить для большинства моих сущностей из-за поля Int Id, если оно равно нулю, база данных еще не присвоила ему значение идентификатора. Это невозможно, если это составной первичный ключ.

Есть ли у кого-нибудь предложения о том, как определить, является ли экземпляр сущности новым или обновлением существующей записи?

Редактировать : Я забыл упомянуть, что эти объекты являются POCO, созданными для кода вначале, поэтому у меня нет свойства EntityState для самого объекта.

Ответы [ 2 ]

6 голосов
/ 27 октября 2010

Да, так как приведенные выше ответы указывают, вы проверяете EntityState для сущности в OSM.

Однако имейте в виду, что это работает только для сущностей, связанных с контекстом / графиком.

В настоящее время я работаю с отсоединенными сущностями (ASP.NET MVC), и поскольку они не привязаны к графику, EntityState не изменяется.

В этом случае я делаюпредупредительный вызов в БД для получения объекта ключом.Если ничего не возвращается, я делаю Add, в противном случае я использую ApplyCurrentValues ​​ для переопределения значений, затем делаю .SaveChanges

Мне все еще интересно, если этоправильный путь, но подумал, что я бы это там изложил.

Я использую POCO, у которых нет отслеживания изменений, поэтому мне нужно проделать немного больше работы.

Поскольку EntityState для POCO отсутствует, вам нужно вручную вызвать OSM:

var pocosInGraph = ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)

После того, как вы присоедините / добавите, ваш POCO должен быть в этой коллекции.

Как я уже сказал, если это для приложения MVC, ваши сущности отсоединяются по HTTPPOST, и, следовательно, EntityState все равно останется неизменным.

В моем случае я вручную установил EntityState после присоединения:

ctx.Attach(poco);
ctx.ObjectStateManager.ChangeObjectState(poco, EntityState.Modified);
ctx.SaveChanges();
3 голосов
/ 27 октября 2010
if (x.EntityState == System.Data.EntityState.Added)
//Add
else if (x.EntityState == System.Data.EntityState.Modified)
//Attach

для получения дополнительной информации

http://msdn.microsoft.com/en-us/library/system.data.entitystate.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...