我在Asp.net中遇到了实体框架问题。无论何时将对象添加到数据库,我都想获取Id值。我怎样才能做到这一点?如何获取实体框架中插入实体的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
}
默认实体框架遵循每个INSERT
与SELECT SCOPE_IDENTITY()
当使用自动生成的Id
秒。
所以你问错了问题。如果您遇到异常问题,您应该提问显示您的异常(以及内部异常)和导致该错误的代码段。 – 2011-03-06 20:09:01
请确保您添加的实体是一个有效的实体例如,用“不空”数据库的限制,仍必须填写等 – fran 2011-06-03 09:35:44
@LadislavMrnka:关于新创建的对象的导航属性是什么?保存更改后,它们似乎不会自动填充。 – 2014-11-11 18:21:15
请参阅此链接。
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
}
与顶部投票答案相同。 – Lewis86 2018-02-22 17:56:53
您需要在savechanges后重新加载实体。因为它已被EF无法跟踪的数据库触发器更改。因此,我们需要从数据库重新载入实体,
db.Entry(MyNewObject).GetDatabaseValues();
然后
int id = myNewObject.Id;
请看下面的问题@jayantha答案:
How can I get Id of inserted entity in Entity framework when using defaultValue?
嗨,当我这样做,我得到的编译错误,说:无法解析属性,例如ID或名称,你能帮助我吗? – 2014-10-17 05:41:27
@MortezaAzizi这似乎是没有处理或空属性问题的错误,但你可以请更多的解释或写一些代码片段? – QMaster 2014-10-18 08:54:29
我遇到的情况我需要在数据库中插入数据&同时需要使用实体框架的主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;
}
Repository.addorupdate(entity, entity.id);
Repository.savechanges();
Var id = entity.id;
这将工作。
版本库不负责将更改保存到数据库中。这是UnitOfWork的工作。 – tchelidze 2017-11-11 10:55:32
我一直在使用Ladislav Mrnka's answer在使用实体框架时成功检索ID,但是由于我一直错过使用它(即在不需要它的地方使用它),并且认为我会在此发布我的发现在这种情况下,人们正在寻求“解决”我所遇到的问题。
考虑与客户具有外键关系的订单对象。当我在同一时间添加新客户和新订单时,我正在做这样的事情;
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和订单之间的外键关系。客户编号
我所要做的就是这一点;
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过度使用得票最多的答案的东西,可能不需要。
谢谢!重要最佳实践提示:var order = new Order {Customer = customer};这显示了Entity Framework分配相关对象的强大功能,并且Id将自动更新。 – 2017-07-09 19:06:17
感谢您特别指出这一点。我正在做默认的。为此+1 – user2695433 2017-09-19 05:33:51
只能保存后得到的ID,而不是你可以创建一个新的GUID和保存之前分配。
当您使用EF 6.x的代码首先
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
并初始化数据库表,就会把一个
(newsequentialid())
表格属性里面的头默认值,或绑定下,允许该ID在插入时填充。
的问题是,如果你创建一个表,并在以后添加
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
一部分,未来的更新数据库将不会加回(NEWSEQUENTIALID())
要解决的正确方法是擦除迁移,删除数据库并重新迁移......或者您可以将(newsequentialid())添加到表设计器中。下面
- 1. 如何使用实体框架获取上次插入的ID
- 2. 如何使用实体框架插入并获取PK ID?
- 3. 实体框架在foreach中获取多个插入的ID
- 4. 实体框架插入子实体
- 5. 实体框架插入新实体
- 6. 插入后在实体框架中获取记录ID
- 7. 实体框架 - 按ID插入
- 8. 获取datomic中插入实体的ID?
- 9. 实体框架4获取插入记录的主键ID
- 10. 获取最近创建的实体的ID - ADO实体框架
- 11. 实体框架:获取相关实体
- 12. 从实体框架中的父实体获取子实体c#
- 13. C#实体框架,获取插入ID(通用)
- 14. 实体框架LINQ插入
- 15. C# - 实体框架插入
- 16. 实体框架应插入
- 17. 实体框架:表插入
- 18. 获取ID值与实体框架
- 19. 从实体框架获取项目ID
- 20. 实体框架:当实体ID的SaveChanges
- 21. 实体框架插入错误的实体插入的SaveChanges
- 22. 如何使用实体框架从mysql中获取最后插入的ID
- 23. 如何在使用defaultValue时在Entity框架中获取插入实体的Id?
- 24. 如何阻止实体框架插入关联的实体?
- 25. 实体框架如何插入新值?
- 26. 如何将实体框架插入ntext?
- 27. 实体框架获取具有子实体的实体
- 28. 实体框架1 - 如何插入涉及导航实体
- 29. 与实体框架获取
- 30. 组合框和实体框架,如何获取ID? (WPF-MVVM)
由拉吉斯拉夫Mrnka答案是正确的答案,并应接受这样的。 – 2016-05-17 07:40:43
OP只会用他/她的账户发布一次,这个问题要更具体一些。这给了他/她几乎2K的声望(!),答案没有被标记为接受,因为该账户自那一天起被放弃。 – MurariAlex 2017-09-15 19:48:18