LINQ to Entities - Как лучше всего получить значение IDENTITY после вызова SaveChanges () - PullRequest
2 голосов
/ 02 февраля 2012

На этом сайте было множество вопросов, связанных с поиском IDENTITY после выполнения вставки. Способ получения идентификатора заключается в том, чтобы сделать вызов ниже, сразу после вызова SaveChanges ();

context.MyClass.OrderByDescending(c => c.Id).FirstOrDefault();

Это, кажется, работает последовательно, может быть вполне адекватным; тем не менее, он имеет видимость возникновения ошибки, если между вызовами будет добавлена ​​еще одна запись. Таким образом, первый вопрос, учитывая, что EF работает в трансациональном контексте, является ли этот метод надежным?

Во-вторых, ответ на следующий вопрос предполагает, что может быть лучший способ.

Linq to SQL - Как найти значение столбца IDENTITY после InsertOnSubmit ()

В этом ответе после вызова SubmitChanges () следующий вызов (где "tst" представляет класс пользователя) возвращает значение.

Response.Write("id:" + tst.id.ToString)

Похоже, что это работает точно так же в LINQ to Entities, где после вызова для сохранения изменений экземпляр класса теперь включает идентификатор.

context.MyClass.Add(myClass);
context.SaveChanges();
int myNewIdentity = myClass.Id;

Поскольку мы запрашиваем фактический идентификатор экземпляра класса (фактическую запись), он может показаться отказоустойчивым. И кажется логичным, что разработчики EF должны предоставить такую ​​базовую функциональность. Может ли кто-нибудь подтвердить, что это правильный способ получить личность или хотя бы лучшую практику?

1 Ответ

2 голосов
/ 05 февраля 2012

Да, LINQ-to-Entities (и LINQ-to-SQL в этом отношении) вернут сгенерированный столбец идентификаторов в сущность для вас после вызова SaveChanges.Это также будет сделано для любых внешних ключей, которые не могут быть установлены заранее (например, новая родительская строка + новая дочерняя строка сохраняются вместе, и после SaveChanges у вас будет правильное значение в FK дочерней строкизначение).

Ваша конкретная проблема описана на странице «Работа с ключами сущностей»:

http://msdn.microsoft.com/en-us/library/dd283139.aspx

Особый раздел - «Ключи сущностей и добавленные объекты»и конкретные шаги:

4 - Если операция INSERT завершается успешно, сгенерированные сервером значения записываются обратно в ObjectStateEntry.

5 - ObjectStateEntry обновляет объект сгенерированным сервером значением.

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