我们首先使用实体框架代码,当我们不想回滚插入、更新和删除的实体更改时,我遇到了问题SaveChanges()
。
具体来说,我有一个用作 TableEditor 的 datagridview 来更改一些辅助表。datagridview 绑定到DbSet<TEntity>
.
我的更新回滚似乎工作正常,我只是将 currentValues 设置回它们的 OriginalValues,并将状态更改为unchanged
.
当一条记录插入到gridview(但没有保存更改)时,它永远不会出现在实体类中,我再也看不到它了......所以我猜它不会进入dbSet,并且没有回滚需要这个吗?
但我的主要问题在于 Delete:
据我了解,当一条记录被“删除”(例如tableData.Remove(currentItem);
)时,它只是被标记为删除,直到调用 SaveChanges 为止。因此,如果我将 State 从deleted
back 更改为unchanged
,那应该可以处理回滚,对吗?
好吧,记录确实再次显示,但记录的导航属性消失了!(即包含外键和与其他实体的必需关系的列)。为什么是这样??!
这是我到目前为止所拥有的:
public void RollbackChanges(DbEntityEntry entry)
{
if (entry.State == EntityState.Modified)
{
foreach (var propertyName in entry.OriginalValues.PropertyNames)
{
entry.CurrentValues[propertyName] = entry.OriginalValues[propertyName];
}
entry.State = EntityState.Unchanged;
}
else if (entry.State == EntityState.Deleted)
{
entry.State = EntityState.Unchanged;
}
else if ((entry.State == EntityState.Added) || (entry.State == EntityState.Detached))
{
MessageBox.Show("I don't think this ever happens?");
}
}
示例用法:
foreach (var entity in db.CertificationDecisions)
{
DbEntityEntry entry = db.Entry(entity );
if (entry.State != EntityState.Unchanged)
{
RollbackChanges(entry);
}
}
任何想法为什么导航属性会从记录中消失?(或者我能做些什么让他们回来?)
编辑: @Chris 关于使用
Refresh
:
我正在使用DbContext,所以我用这一行替换了我的回滚方法:
((IObjectContextAdapter)db).ObjectContext.Refresh(RefreshMode.StoreWins, db.CertificationDecisions);
但是,这似乎并没有重新加载上下文,因为记录仍然丢失......我用Refresh
错了吗?
这听起来像是我的问题的可能解决方案,但我仍然想知道为什么会删除导航属性?