我怎样才能得到在entity framework中插入实体的Id?
我在Asp.net的entity framework中遇到问题。 每当我向数据库添加一个对象时,我想获得Id值。 我该怎么做?
这很容易。 如果您正在使用数据库生成的ID(如MS SQL中的IDENTITY
),则只需将实体添加到相关ObjectContext
上的ObjectSet
和SaveChanges
。 Id
将自动填写给你:
using (var context = new MyContext()) { context.MyEntities.AddObject(myNewObject); context.SaveChanges(); int id = myNewObject.Id; // Yes it's here }
当使用自动生成的Id
时,entity framework在默认情况下跟随每个INSERT
和SELECT 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; }