每次将实体插入我的数据库时,我都有一些代码需要运行,问题是此代码需要实体 PrimaryKey。
我发现我可以使用 EntityState.Unchanged 从 ObjectStateManager 获取实体,这是插入后的对象,但我不确定这是否始终是 ObjectContext 中唯一以“Unchanged”作为其 EntityState 的对象。
是否有可靠的方法仅针对刚刚插入 ObjectContext 的对象运行代码?
每次将实体插入我的数据库时,我都有一些代码需要运行,问题是此代码需要实体 PrimaryKey。
我发现我可以使用 EntityState.Unchanged 从 ObjectStateManager 获取实体,这是插入后的对象,但我不确定这是否始终是 ObjectContext 中唯一以“Unchanged”作为其 EntityState 的对象。
是否有可靠的方法仅针对刚刚插入 ObjectContext 的对象运行代码?
是的,有办法。您必须调用重载SaveChanges
,它不会在自动保存后接受更改,而是您将负责调用AcceptAllChanges
。在这种情况下,对象在调用后仍将处于已添加状态SaveChanges
(但仅在您调用之前AcceptAllChanges
)。一般代码应如下所示:
using (var scope = new TransactionScope(...))
{
context.SaveChanges(SaveOptions.DetectChangesBeforeSave);
// Run your code here
context.AcceptAllChanges();
scope.Complete();
}
事务范围不是必需的 - 如果您发布插入代码必须在带有插入的事务中运行,这只是该方法的示例。
您还可以将该代码包装到覆盖中SaveChanges
,以便将其放在集中位置。