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


当前回答

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

或者你也可以用这个。

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

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

其他回答

我遇到了一种情况,我需要在数据库中插入数据&同时需要使用实体框架的主id。 解决方案:

long id;
IGenericQueryRepository<myentityclass, Entityname> InfoBase = null;
try
 {
    InfoBase = new GenericQueryRepository<myentityclass, Entityname>();
    InfoBase.Add(generalinfo);
    InfoBase.Context.SaveChanges();
    id = entityclassobj.ID;
    return id;
 }

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

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

db.Entry(MyNewObject).GetDatabaseValues();

然后

int id = myNewObject.Id;

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

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

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

实体框架刷新上下文?

有两种策略:

使用数据库生成的ID (int或GUID) 缺点: 您应该执行SaveChanges()来获取刚刚保存的实体的ID。 优点: 可以使用int标识。 仅使用客户端生成的ID - GUID。 优点: 缩小SaveChanges操作。 能够在每次操作中插入新对象的大图形。 缺点: 只允许用于GUID

Repository.addorupdate(entity, entity.id);
Repository.savechanges();
Var id = entity.id;

这是可行的。