我怎样才能得到在entity framework中插入实体的Id?

我在Asp.net的entity framework中遇到问题。 每当我向数据库添加一个对象时,我想获得Id值。 我该怎么做?

这很容易。 如果您正在使用数据库生成的ID(如MS SQL中的IDENTITY ),则只需将实体添加到相关ObjectContext上的ObjectSetSaveChangesId将自动填写给你:

 using (var context = new MyContext()) { context.MyEntities.AddObject(myNewObject); context.SaveChanges(); int id = myNewObject.Id; // Yes it's here } 

当使用自动生成的Id时,entity framework在默认情况下跟随每个INSERTSELECT SCOPE_IDENTITY()

savechanges后你需要重新加载实体。 因为已经被EF无法跟踪的数据库触发器所改变。 所以我们需要从DB重新加载实体,

 db.Entry(MyNewObject).GetDatabaseValues(); 

然后

 int id = myNewObject.Id; 

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

如何在使用defaultValue的时候在Entity框架中获取插入实体的Id?

我一直在使用Ladislav Mrnka的答案 ,在使用entity framework时成功检索ID,但是我在这里发帖是因为我错过了使用它(即在不需要它的地方使用它),并认为我会在此发布我的发现,人们正在寻求“解决”我所遇到的问题。

考虑一个与Customer有外键关系的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.SaveChanges();//adds customer.Id to customer and the correct CustomerId to order 

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

我知道这并不能回答原来的问题,但认为这可能会帮助那些对EF不熟悉的开发人员过度使用顶级答案来解决某些可能不需要的问题。

请参考这个链接。

http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/

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

否则你也可以使用这个。

 using (var context = new MyContext()) { context.MyEntities.AddObject(myNewObject); context.SaveChanges(); int id = myNewObject.Id; // Your Identity column ID } 

在将更改传播到数据库之后,要保存的对象应具有正确的Id

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

这将工作。

您只能在保存后才能获取ID,而不是在保存之前创build一个新的Guid。

我碰到的情况下,我需要插入数据在数据库中,同时需要使用entity framework的主要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; }