LINQ to Entities - 调用SaveChanges()后如何最好地获取IDENTITY值

时间:2012-02-02 17:24:13

标签: linq entity-framework identity

在此网站上提出了许多与执行插入后检索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的设计者应该提供这样的基本功能似乎是合乎逻辑的。任何人都可以确认这是获得身份或至少是最佳做法的正确方法吗?

1 个答案:

答案 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使用服务器生成的值更新对象。