LINQ to Entities - How best to obtain the IDENTITY value after calling SaveChanges()

☆樱花仙子☆ 提交于 2019-12-31 03:42:26

问题


There have been numerous questions posed on this site relating to the retrieval of the IDENTITY after an insert is performed. The way we have been getting the identity is to make the call below, immediately after calling SaveChanges();

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

This seems to work consistently may be completely adequate; however, it has the appearence of opening up a potential for error, should another record be added in between the calls. So the first question is, given that EF performs withing a transacional context, is this method sound?

Secondly, the answer provided to the following question suggests there may be a better way.

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

In that answer, after calling SubmitChanges(), the following call (where "tst" represents the user's class) retrieves the value.

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

This appears to work exactly the same way in LINQ to Entities, where after the call to save changes the instance of the class now includes the id.

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

Since we are asking for the the actual ID of the class instance (actual record) it would appear to be failsafe. And, it seems logical that the designers of EF should make such basic functionality available. Can anyone confirm that this is proper way to get the identity or at least a best practice?


回答1:


Yes, LINQ-to-Entities (and LINQ-to-SQL for that matter) will set the generated identity column back in the entity for you after SaveChanges is called. It will also do so for any foreign keys that couldn't be set ahead of time (for instance, a new parent row + a new child row are saved together, and after SaveChanges you'll have the right value in the child row's FK value).

Your particular concern is documented in the 'Working with Entity Keys' page:

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

The particular section is 'Entity Keys and Added Objects' and the particular steps are:

4 - If the INSERT operation succeeds, server-generated values are written back to the ObjectStateEntry.

5 - The ObjectStateEntry updates the object with the server-generated value.



来源:https://stackoverflow.com/questions/9116878/linq-to-entities-how-best-to-obtain-the-identity-value-after-calling-savechang

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!