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


当前回答

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

db.Entry(MyNewObject).GetDatabaseValues();

然后

int id = myNewObject.Id;

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

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

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

实体框架刷新上下文?

其他回答

这很简单。如果您使用DB生成的id(如MS SQL中的IDENTITY),您只需要将实体添加到ObjectSet和相关ObjectContext上的SaveChanges。Id将自动为您填写:

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

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

当使用自动生成的id时,实体框架默认在每个INSERT后面使用SELECT SCOPE_IDENTITY()。

Repository.addorupdate(entity, entity.id);
Repository.savechanges();
Var id = entity.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字段,它就开始工作了。

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

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

db.Entry(MyNewObject).GetDatabaseValues();

然后

int id = myNewObject.Id;

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

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

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

实体框架刷新上下文?

当你使用EF 6。X码优先

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

并初始化一个数据库表,它会放一个

(newsequentialid())

在表头Default Value或Binding下的表属性中,允许在插入时填充ID。

问题是,如果创建一个表并添加

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

稍后,未来的更新数据库将不会添加回(newsequentialid())

正确的修复方法是擦除迁移,删除数据库,重新迁移…或者你可以在表设计器中添加(newsequentialid())。