5

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

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

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

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);
    }
}

谢谢您的帮助

4

2 回答 2

3

您不应该将上下文保持在其工作单元之外。上下文应该只在需要时才能存在,否则你一定会遇到像你观察到的缓存陷阱。(此外,上下文真的没有那么重,在需要时实例化它过于耗时/资源密集)。

如果你真的必须让它保持活力,你可能想要考虑将上下文传递给辅助表单。

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

于 2012-12-20T16:44:52.220 回答
0

首先,布拉德说了什么。只为特定的工作单元保持上下文活动并处理它。不这样做只会导致头痛。

您还可以使用 ObjectStateManager 检查实体的状态并传入对象或实体键。您还可以使用

public void Refresh( RefreshMode refreshMode, IEnumerable collection )

上下文之外的方法。此外,您可以检查进入状态。

http://msdn.microsoft.com/en-us/library/bb503718.aspx

于 2012-12-20T16:51:05.743 回答