我在ASP.NET实体框架有一个问题。我想获得Id值每当我添加一个对象到数据库。我该怎么做呢?
根据实体框架,解决方案是:
using (var context = new EntityContext())
{
var customer = new Customer()
{
Name = "John"
};
context.Customers.Add(customer);
context.SaveChanges();
int id = customer.CustomerID;
}
这不会得到数据库表的标识,但得到实体的指定ID,如果我们从表中删除一条记录,种子标识将与实体ID不匹配。
所有的答案都非常适合自己的场景,我所做的不同之处在于,我直接从对象(TEntity)分配了int PK, Add()返回到这样的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先生:
我正在使用MySQL数据库,我有一个AUTO_INCREMENT字段Id。
我在EF也遇到了同样的问题。
我试过下面的行,但它总是返回0。
await _dbContext.Order_Master.AddAsync(placeOrderModel.orderMaster);
await _dbContext.SaveChangesAsync();
int _orderID = (int)placeOrderModel.orderMaster.Id;
但我意识到我的错误并改正了它。
我正在做的错误:我在orderMaster模型中为Id字段传递0
解决方案起作用了:一旦我从orderMaster模型中删除Id字段,它就开始工作了。
我知道这是个很愚蠢的错误,但如果有人没注意到,就写在这里。
当你使用EF 6。X码优先
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
并初始化一个数据库表,它会放一个
(newsequentialid())
在表头Default Value或Binding下的表属性中,允许在插入时填充ID。
问题是,如果创建一个表并添加
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
稍后,未来的更新数据库将不会添加回(newsequentialid())
正确的修复方法是擦除迁移,删除数据库,重新迁移…或者你可以在表设计器中添加(newsequentialid())。