在此网站上提出了许多与执行插入后检索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()之后,以下调用(其中“tst”表示用户的类)检索该值。
Response.Write("id:" + tst.id.ToString)
这似乎在LINQ to Entities中完全相同,在调用保存更改后,类的实例现在包含id。
context.MyClass.Add(myClass);
context.SaveChanges();
int myNewIdentity = myClass.Id;
由于我们要求的是类实例(实际记录)的实际ID,因此它似乎是故障安全的。并且,EF的设计者应该提供这样的基本功能似乎是合乎逻辑的。任何人都可以确认这是获得身份或至少是最佳做法的正确方法吗?
答案 0 :(得分:2)
是的,在调用SaveChanges之后,LINQ-to-Entities(以及LINQ-to-SQL)将在您的实体中设置生成的标识列。对于任何无法提前设置的外键,它也会这样做(例如,新的父行+新的子行被保存在一起,而在SaveChanges之后,你将在子行的FK中拥有正确的值值)。
“使用实体密钥”页面记录了您特别关注的问题:
http://msdn.microsoft.com/en-us/library/dd283139.aspx
特定部分是“实体密钥和添加对象”,具体步骤如下:
4 - 如果INSERT操作成功,则将服务器生成的值写回ObjectStateEntry。
5 - ObjectStateEntry使用服务器生成的值更新对象。