协慌网

登录 贡献 社区

如何使用 Entity Framework 检索插入的实体的 ID?

我在 ASP.NET 中的实体框架有问题。每当将对象添加到数据库时,我都希望获得 Id 值。我怎样才能做到这一点?

根据实体框架,解决方案是:

using (var context = new EntityContext())
{
    var customer = new Customer()
    {
        Name = "John"
    };

    context.Customers.Add(customer);
    context.SaveChanges();
        
    int id = customer.CustomerID;
}

这不会获取数据库表标识,但会获取实体的分配 ID,如果我们从表中删除一条记录,则种子标识将与实体 ID 不匹配。

答案

这很容易。如果您使用的是数据库生成的 ID(例如IDENTITY ),则只需将实体添加到ObjectSet然后在相关的ObjectContext SaveChangesId将自动为您填写:

using (var context = new MyContext())
{
  context.MyEntities.Add(myNewObject);
  context.SaveChanges();

  int id = myNewObject.Id; // Yes it's here
}

当使用自动生成的Id时,默认情况下,实体框架在每个INSERT带有SELECT SCOPE_IDENTITY()

在使用实体框架时,我一直在使用Ladislav Mrnka 的答案来成功检索 ID,但是我在这里发布是因为我一直在滥用它(即在不需要它的地方使用它),并认为我会将我的发现发布在这里 - 案例中的人们希望 “解决” 我遇到的问题。

考虑与客户具有外键关系的 Order 对象。当我同时添加一个新客户和一个新订单时,我正在执行以下操作:

var customer = new Customer(); //no Id yet;
var order = new Order(); //requires Customer.Id to link it to customer;
context.Customers.Add(customer);
context.SaveChanges();//this generates the Id for customer
order.CustomerId = customer.Id;//finally I can set the Id

但是在我的情况下,这不是必需的,因为我在 customer.Id 和 order.CustomerId 之间具有外键关系

我所要做的就是这个。

var customer = new Customer(); //no Id yet;
var order = new Order{Customer = customer}; 
context.Orders.Add(order);
context.SaveChanges();//adds customer.Id to customer and the correct CustomerId to order

现在,当我保存更改时,为客户生成的 ID 也将添加到订单中。我不需要其他步骤

我知道这并不能回答最初的问题,但我认为这可能会帮助 EF 新手开发人员避免过度使用票房最高的答案来解决不必要的问题。

这也意味着更新可以在单个事务中完成,从而避免使用 orphin 数据(要么完成更新,要么不更新)。

保存更改后,您需要重新加载实体。因为它已被数据库触发器更改,但 EF 无法跟踪该触发器。因此,我们需要再次从数据库重新加载实体,

db.Entry(MyNewObject).GetDatabaseValues();

然后

int id = myNewObject.Id;

看看下面问题中的 @jayantha 答案:

使用 defaultValue 时,如何获取实体框架中插入的实体的 ID?

在以下问题中查找 @christian 答案也可能有帮助:

实体框架刷新上下文?