检查Entity是否已被删除

NuN*_*DdY 5 c# entity-framework

我们正在使用 DbContext/Code First 在 winforms 应用程序中实现实体框架,并且有以下关于在另一个上下文中删除/更新实体时检查/处理的正确方法的问题。

例如,我们有一些辅助表数据(例如 StateCodes),用户可以进入另一个并根据需要添加/删除状态。这个辅助编辑器表单利用它自己的 DbContext 并在用户退出表单后保存更改。返回主窗体后,主上下文不知道对数据库所做的更改,因此我们希望重新加载实体的 DbSet。不幸的是,如果我们删除“MI”状态代码,它仍然存在于 DbSet 的 Local 属性中,即使在我们调用“Load”来引入所有内容之后,EntityState 仍保持不变。

除了完全处理主上下文之外,以下是检查和查看是否从数据库中删除了哪些实体的最佳方法?

foreach (State state in db.States.Local)
{
    DbEntityEntry entry = db.Entry(state);
    DbPropertyValues databaseValues = entry.GetDatabaseValues();
    if (databaseValues == null)
    {
        db.States.Remove(state);
    }
    else
    {
        entry.OriginalValues.SetValues(databaseValues);
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助

Bra*_*tie 3

您不应该让上下文在其工作单元之后保持活动状态。上下文应该只在需要时存在,否则您一定会遇到像您所观察到的那样的缓存陷阱。(此外,上下文实际上并没有那么重,在需要时实例化它过于耗时/资源密集)。

如果您确实必须使其保持活动状态,您可能需要考虑将上下文传递给辅助表单。

从我的评论中反映出来,认为这是最好的答案