2012-02-02 3 views
2

На этом сайте было задано множество вопросов, связанных с извлечением IDENTITY после выполнения вставки. То, как мы получаем личность, - это сделать вызов ниже, сразу после вызова SaveChanges();LINQ to Entities - как лучше всего получить значение IDENTITY после вызова SaveChanges()

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

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

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

Linq to SQL - How to find the the value of the IDENTITY column after InsertOnSubmit()

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

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

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

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

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

+0

Идентификация должна быть обновлена ​​в основном для отслеживания изменений, поэтому да, это, скорее всего, лучший способ. – Marc

ответ

2

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

Ваше особое беспокойство документирована в "Работа с Entity Киз страницы:

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

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

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

5 - ObjectStateEntry обновляет объект с помощью генерируемого сервером значения.

0

Конечно, это способ сделать это. Почему вы думаете, что это не так?