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
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
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
}
using (var context = new MyContext())
{
context.MyEntities.AddObject(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Your Identity column ID
}
11 回答
这会奏效 .
当您首先使用EF 6.x代码时
并初始化一个数据库表,它会放一个
在 Headers Default Value或Binding下的表属性内,允许在插入ID时填充ID .
问题是如果您创建一个表并添加
部分之后,未来的更新数据库将不会添加(newsequentialid())
要修复正确的方法是擦除迁移,删除数据库并重新迁移...或者您只需将(newsequentialid())添加到表设计器中 .
这很简单 . 如果您正在使用DB生成的ID(如MS SQL中的
IDENTITY
),则只需在ObjectSet
上添加实体ObjectSet
和SaveChanges
.Id
将自动为您填写:当使用自动生成的
Id
时,默认情况下,实体框架在每个INSERT
与SELECT SCOPE_IDENTITY()
之后 .您只能在保存后获取ID,而是可以在保存之前创建新的Guid并进行分配 .
有两种策略:
ID
(int
或GUID
)缺点:
您应该执行
SaveChanges()
以获取刚刚保存的实体的ID
.优点:
可以使用
int
身份 .ID
- 仅限GUID .优点:缩小
SaveChanges
操作 . 能够在每个操作中插入新对象的大图 .缺点:
仅允许
GUID
我在使用实体框架时一直使用Ladislav Mrnka's answer来成功检索ID但是我在这里发帖是因为我曾经错过了使用它(即在不需要它的地方使用它)并认为我会在这里发布我的调查结果以防万一正在寻找"solve"我遇到的问题 .
考虑与Customer具有外键关系的Order对象 . 当我在同一时间添加新客户和新订单时,我正在做这样的事情;
但是在我的情况下,这不是必需的,因为我在customer.Id和order.CustomerId之间有一个外键关系
我所要做的就是这个;
现在,当我保存更改时,为客户生成的ID也会添加到订单中 . 我不需要额外的步骤
我知道这并没有回答原来的问题,但认为它可能会帮助EF新手的开发人员过度使用最高投票的答案来解决可能不需要的问题 .
在将更改传播到数据库之后,您要保存的对象应该具有正确的
Id
.我遇到一种情况,我需要在数据库中插入数据,同时需要使用实体框架的主要ID . 方案:
所有答案都非常适合他们自己的场景,我做的不同就是我直接从对象(TEntity)分配了int PK,Add()返回到这样的int变量;
所以不要创建一个完整的新对象,而是只需要你想要的东西:)
编辑@GertArnold先生:
您需要在savechanges之后重新加载实体 . 因为它已被EF无法跟踪的数据库触发器更改 . 所以我们需要从DB重新加载实体,
然后
请看以下问题中的@jayantha答案:
How can I get Id of inserted entity in Entity framework when using defaultValue?
在下面的问题中看@christian答案也可能有所帮助:
Entity Framework Refresh context?
请参阅此链接 .
http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/
您必须将StoreGeneratedPattern的属性设置为identity,然后尝试自己的代码 .
否则你也可以使用它 .