Всегда ли EF4 использует временный ключ для вновь добавленных объектов? - PullRequest
0 голосов
/ 02 февраля 2012

Я пытался найти новые добавленные объекты в контексте, используя TryGetObjectByKey:

Dim ObjectFound As Boolean = Context.TryGetObjectByKey(entityKey, obj)

Я обнаружил, что TryGetObjectByKey всегда терпел неудачу, даже когда я знал, что искомая сущность была добавлена ​​в контекст. Рассматриваемая сущность использует адрес электронной почты в качестве первичного ключа, и этот адрес электронной почты предоставляется через конструктор для сущности (он не генерируется БД):

Public Class Customer
   Private _email as string

   Public Sub New (Email as string)
        'Email is the primary key in the DB and the entity key in EF4.
        'It is not generated by the DB.
       _email = Email
   End Sub

End Class

После дальнейшего изучения я обнаружил, что EntityKeys для всех добавленных сущностей не имеет значений, а их флаг IsTeorary был установлен в значение true. Ошибка TryGetObjectByKey, поскольку EntityKey для добавленных объектов еще не установлен.

Изначально у меня сложилось впечатление, что EntityKey будет сгенерирован сразу после вызова AddObject, если EntityKey не был сгенерирован БД. Итак, два вопроса:

1) Стоит ли ожидать, что все вновь добавленные объекты будут иметь временные ключи EntityKeys?

2) Если # 1 истинно, как я могу найти вновь добавленные объекты по первичному ключу?

1 Ответ

0 голосов
/ 02 февраля 2012

MSDN гласит следующее:

Новый объект добавляется в ObjectContext либо путем вызова Метод AddObject для ObjectContext или ObjectSet или путем добавления объекта к коллекции объектов на «многих» концах отношений.

На этом этапе Entity Framework генерирует временный ключ, который используется для хранения объектов в ObjectStateManager.

Только после SaveChanges (и соответствующего оператора Insert) создается EntityKey.

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