我在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不匹配。


当前回答

我正在使用MySQL数据库,我有一个AUTO_INCREMENT字段Id。

我在EF也遇到了同样的问题。

我试过下面的行,但它总是返回0。

      await _dbContext.Order_Master.AddAsync(placeOrderModel.orderMaster);
      await _dbContext.SaveChangesAsync();

      int _orderID = (int)placeOrderModel.orderMaster.Id;

但我意识到我的错误并改正了它。

我正在做的错误:我在orderMaster模型中为Id字段传递0

解决方案起作用了:一旦我从orderMaster模型中删除Id字段,它就开始工作了。

我知道这是个很愚蠢的错误,但如果有人没注意到,就写在这里。

其他回答

我正在使用MySQL数据库,我有一个AUTO_INCREMENT字段Id。

我在EF也遇到了同样的问题。

我试过下面的行,但它总是返回0。

      await _dbContext.Order_Master.AddAsync(placeOrderModel.orderMaster);
      await _dbContext.SaveChangesAsync();

      int _orderID = (int)placeOrderModel.orderMaster.Id;

但我意识到我的错误并改正了它。

我正在做的错误:我在orderMaster模型中为Id字段传递0

解决方案起作用了:一旦我从orderMaster模型中删除Id字段,它就开始工作了。

我知道这是个很愚蠢的错误,但如果有人没注意到,就写在这里。

您必须将StoreGeneratedPattern的属性设置为identity,然后尝试自己的代码。

或者你也可以用这个。

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

  int id = myNewObject.Id; // Your Identity column ID
}

在使用实体框架时,我一直在使用Ladislav Mrnka的答案来成功检索id,但我在这里发布是因为我误用了它(即在不需要的地方使用它),我想我会在这里发布我的发现,以防人们正在寻找“解决”我遇到的问题。

考虑一个Order对象,它与Customer有外键关系。当我同时添加一个新客户和一个新订单时,我是这样做的;

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

然而,在我的情况下,这是不需要的,因为我有一个外键之间的客户关系。Id和顺序。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数据(要么所有更新都完成,要么没有更新)。

您只能在保存后获取ID,相反,您可以在保存前创建一个新的Guid并分配。

您需要在保存更改后重新加载实体。因为它已被数据库触发器更改,EF无法跟踪。所以我们需要从数据库中重新加载实体,

db.Entry(MyNewObject).GetDatabaseValues();

然后

int id = myNewObject.Id;

看看@jayantha在以下问题中的回答:

当使用defaultValue时,我如何在实体框架中获得插入实体的Id ?

看看下面这个问题@christian的答案可能也会有帮助:

实体框架刷新上下文?