该网站上提出了许多与执行插入后检索 IDENTITY 相关的问题。我们获取身份的方法是在调用 SaveChanges() 之后立即进行以下调用;
context.MyClass.OrderByDescending(c => c.Id).FirstOrDefault();
这似乎一致地工作可能是完全足够的;但是,如果在调用之间添加另一条记录,则可能会出现错误。所以第一个问题是,考虑到 EF 在事务上下文中执行,这种方法是否合理?
其次,对以下问题的回答表明可能有更好的方法。
Linq to SQL - 如何在 InsertOnSubmit() 之后查找 IDENTITY 列的值
在该答案中,调用 SubmitChanges() 后,以下调用(其中“tst”代表用户的类别)检索该值。
Response.Write("id:" + tst.id.ToString)
这似乎与 LINQ to Entities 中的工作方式完全相同,在调用保存更改后,类的实例现在包含 id。
context.MyClass.Add(myClass);
context.SaveChanges();
int myNewIdentity = myClass.Id;
由于我们要求类实例的实际 ID(实际记录),因此它看起来是安全的。而且,EF 的设计者应该提供此类基本功能,这似乎是合乎逻辑的。任何人都可以确认这是获取身份的正确方法或至少是最佳实践吗?
是的,LINQ-to-Entities(以及就此而言的 LINQ-to-SQL)将在调用 SaveChanges 后将生成的标识列设置回实体中。对于无法提前设置的任何外键,它也会这样做(例如,一个新的父行+一个新的子行保存在一起,并且在 SaveChanges 之后,您将在子行的 FK 中获得正确的值)价值)。
您特别关心的问题记录在“使用实体密钥”页面中:
http://msdn.microsoft.com/en-us/library/dd283139.aspx
特定部分是“实体键和添加的对象”,特定步骤是:
4 - 如果 INSERT 操作成功,服务器生成的值将写回 ObjectStateEntry。
5 - ObjectStateEntry 使用服务器生成的值更新对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)