我如何获得实体框架中插入的实体的Id?
我在Asp.net中遇到了实体框架问题。 无论何时将对象添加到数据库,我都想获取Id值。 我怎样才能做到这一点?
这很容易。 如果您使用数据库生成的ID(如MS SQL中的IDENTITY
),则只需将实体添加到ObjectSet
和SaveChanges
相关的ObjectContext
。 Id
会自动为您填写Id
:
using (var context = new MyContext())
{
context.MyEntities.AddObject(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Yes it's here
}
默认情况下,实体框架在使用自动生成的Id
时使用SELECT SCOPE_IDENTITY()
每个INSERT
。
我一直在使用Ladislav Mrnka的答案,在使用实体框架时成功检索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的开发人员过度使用顶级投票答案来解决某些可能不需要的问题。
保存更改后,您需要重新加载实体。 因为它已被EF无法跟踪的数据库触发器更改。 所以我们需要重新从DB重新加载实体,
db.Entry(MyNewObject).GetDatabaseValues();
然后
int id = myNewObject.Id;
在下面的问题看@jayantha答案:
如何在使用defaultValue时在Entity框架中获取插入实体的Id?
在下面的问题看@christian答案也可以帮助:
实体框架刷新上下文?
链接地址: http://www.djcxy.com/p/5731.html上一篇: How can I get Id of inserted entity in Entity framework?
下一篇: Getting all changes made to an object in the Entity Framework