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

LINQ to Entities-调用SaveChanges()后如何最好地获取标识值,linq,entity-framework,identity,Linq,Entity Framework,Identity,在本网站上提出了许多与插入后检索身份相关的问题。我们获取标识的方法是在调用SaveChanges()后立即进行下面的调用 这似乎一直有效,但可能完全足够;但是,如果在两次调用之间添加另一条记录,则它可能会导致错误。因此,第一个问题是,鉴于EF在跨区域环境中执行,这种方法合理吗 第二,以下问题的答案表明可能有更好的方法 在该答案中,在调用SubmitChanges()之后,下面的调用(其中“tst”表示用户的类)检索该值 Response.Write("id:" + tst.id.ToStrin

在本网站上提出了许多与插入后检索身份相关的问题。我们获取标识的方法是在调用SaveChanges()后立即进行下面的调用

这似乎一直有效,但可能完全足够;但是,如果在两次调用之间添加另一条记录,则它可能会导致错误。因此,第一个问题是,鉴于EF在跨区域环境中执行,这种方法合理吗

第二,以下问题的答案表明可能有更好的方法

在该答案中,在调用SubmitChanges()之后,下面的调用(其中“tst”表示用户的类)检索该值

Response.Write("id:" + tst.id.ToString)
这在LINQtoEntities中的工作方式似乎完全相同,在调用保存更改后,类的实例现在包括id

context.MyClass.Add(myClass);
context.SaveChanges();
int myNewIdentity = myClass.Id;
因为我们要求的是类实例的实际ID(实际记录),所以它看起来是故障安全的。而且,EF的设计者应该提供这样的基本功能似乎是合乎逻辑的。有人能确认这是获得身份的正确方法或至少是最佳实践吗

是的,在调用SaveChanges之后,LINQ-to-Entities(以及LINQ-to-SQL)将在实体中为您设置生成的标识列。对于无法提前设置的任何外键,它也会这样做(例如,新的父行+新的子行一起保存,保存更改后,子行的FK值中会有正确的值)

您特别关心的问题记录在“使用实体密钥”页面中:

具体部分为“实体键和添加的对象”,具体步骤为:

4-如果插入操作成功,服务器生成的值将写回ObjectStateEntry

5-ObjectStateEntry使用服务器生成的值更新对象


当然,这是做这件事的方法。为什么你认为不是呢?身份更新主要是为了跟踪变化,所以是的,这很可能是最好的方式。
context.MyClass.Add(myClass);
context.SaveChanges();
int myNewIdentity = myClass.Id;