我在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不匹配。
在使用实体框架时,我一直在使用Ladislav Mrnka的答案来成功检索id,但我在这里发布是因为我误用了它(即在不需要的地方使用它),我想我会在这里发布我的发现,以防人们正在寻找“解决”我遇到的问题。
考虑一个Order对象,它与Customer有外键关系。当我同时添加一个新客户和一个新订单时,我是这样做的;
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和顺序。CustomerId
我所要做的就是这样;
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数据(要么所有更新都完成,要么没有更新)。
所有的答案都非常适合自己的场景,我所做的不同之处在于,我直接从对象(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先生: