提问人:ahmet 提问时间:3/7/2011 最后编辑:TylerHahmet 更新时间:1/6/2023 访问量:653757
如何使用实体框架检索插入实体的 ID?
How can I retrieve Id of inserted entity using Entity framework?
问:
我在 ASP.NET 中使用实体框架有问题。每当我向数据库添加对象时,我都想获取 Id 值。我该怎么做?
根据 Entity Framework,解决方案是:
using (var context = new EntityContext())
{
var customer = new Customer()
{
Name = "John"
};
context.Customers.Add(customer);
context.SaveChanges();
int id = customer.CustomerID;
}
这不会获取数据库表标识,但会获取实体的分配 ID,如果我们从表中删除记录,种子标识将与实体 ID 不匹配。
答:
将更改传播到数据库后,您保存的对象应该是正确的。Id
评论
这很容易。如果您使用的是数据库生成的 Id(如在 MS SQL 中),则只需在相关 . 将自动为您填写:IDENTITY
ObjectSet
SaveChanges
ObjectContext
Id
using (var context = new MyContext())
{
context.MyEntities.Add(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Yes it's here
}
默认情况下,实体框架在使用自动生成的 s 时遵循每个。INSERT
SELECT SCOPE_IDENTITY()
Id
评论
您必须将 的属性设置为 identity,然后尝试自己的代码。StoreGeneratedPattern
否则你也可以使用它。
using (var context = new MyContext())
{
context.MyEntities.AddObject(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Your Identity column ID
}
评论
StoreGeneratedPattern
是我缺失的一块。
保存更改后,您需要重新加载实体。因为它已被 EF 无法跟踪的数据库触发器更改。因此,我们需要再次从数据库重新加载实体,
db.Entry(MyNewObject).GetDatabaseValues();
然后
int id = myNewObject.Id;
请看下面问题@jayantha答案:
使用 defaultValue 时,如何在实体框架中获取插入实体的 ID?
在以下问题中寻找@christian答案也可能有所帮助:
评论
.GetDatabaseValues();
GetDatabaseValues()
我遇到过这样一种情况,即我需要在数据库中插入数据,同时需要使用实体框架的主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;
这将起作用。
评论
Repository
在使用实体框架时,我一直在使用 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
但是,就我而言,这不是必需的,因为我在客户之间有外键关系。ID 和顺序。客户 ID
我所要做的就是这个;
var customer = new Customer(); //no Id yet;
var order = new Order{Customer = customer};
context.Orders.Add(order);
context.SaveChanges();//adds customer.Id to customer and the correct CustomerId to order
现在,当我保存更改时,为客户生成的 ID 也会添加到订单中。我不需要额外的步骤
我知道这并不能回答最初的问题,但认为它可能会帮助刚接触 EF 的开发人员避免过度使用可能不需要的票数最高的答案。
这也意味着更新在单个事务中完成,从而可能避免 orphin 数据(所有更新都完成,或者没有更新完成)。
评论
只有在保存后才能获取 ID,而是可以在保存前创建新的 Guid 并分配。
评论
首先使用 EF 6.x 代码时
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
并初始化一个数据库表,它会把一个
(newsequentialid())
在标题“默认值”或“绑定”下的表属性中,允许在插入 ID 时填充 ID。
问题是,如果您创建一个表并将
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
稍后,未来的 update-databases 不会添加回 (newsequentialid())
修复正确的方法是擦除迁移,删除数据库并重新迁移...或者,您可以将 (NewsequentialId()) 添加到表设计器中。
评论
when -column- is NULL, then NEWID()
有两种策略:
使用数据库生成的 ( 或
ID
int
GUID
)缺点:
您应该执行以获取刚刚保存的实体。
SaveChanges()
ID
优点:
可以使用标识。
int
仅使用客户端生成的 - GUID。
ID
优点: 操作的缩小。 能够为每个操作插入一个新对象的大图。
SaveChanges
缺点:
仅允许用于
GUID
所有答案都非常适合他们自己的场景,我所做的不同之处在于,我直接从 Add() 返回的对象 (TEntity) 将 int PK 分配给这样的 int 变量;
using (Entities entities = new Entities())
{
int employeeId = entities.Employee.Add(new Employee
{
EmployeeName = employeeComplexModel.EmployeeName,
EmployeeCreatedDate = DateTime.Now,
EmployeeUpdatedDate = DateTime.Now,
EmployeeStatus = true
}).EmployeeId;
//...use id for other work
}
因此,您无需创建一个全新的对象,而只需获取您想要的东西:)
编辑 @GertArnold先生:
评论
Add
DbSet.Add
EmployeeId
SaveChanges
EmployeeId
Employee
ForSqlServerUseSequenceHiLo
我正在使用MySQL DB,我有一个AUTO_INCREMENT字段ID。
我在 EF 中遇到了同样的问题。
我尝试了以下行,但它总是返回 0。
await _dbContext.Order_Master.AddAsync(placeOrderModel.orderMaster);
await _dbContext.SaveChangesAsync();
int _orderID = (int)placeOrderModel.orderMaster.Id;
我犯的错误:我在 Id 字段的 orderMaster 模型中传递了 0
解决方案奏效:一旦我从我的orderMaster模型中删除了Id字段,它就开始工作了。
我知道这是一个非常愚蠢的错误,但如果有人错过了这个,就放在这里。
评论
SaveChanges