【问题标题】:LINQ to Entities - How best to obtain the IDENTITY value after calling SaveChanges()LINQ to Entities - 调用 SaveChanges() 后如何最好地获取 IDENTITY 值
【发布时间】:2012-02-05 15:07:18
【问题描述】:

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

【问题讨论】:

  • 当然是这样做的。为什么你会认为它不是?
  • 身份必须更新主要用于更改跟踪,所以是的,这很可能是最好的方法。

标签: linq entity-framework identity


【解决方案1】:

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

您的特别关注记录在“使用实体键”页面中:

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

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

4 - 如果 INSERT 操作成功,服务器生成的值将被写回到 ObjectStateEntry。

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

【讨论】:

    猜你喜欢
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多