检查实体是否已被删除

时间:2012-12-20 16:39:23

标签: c# entity-framework

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

例如,我们有一些辅助表数据(例如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);
    }
}

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

您不应该将上下文保持在其工作单元之外。上下文应该只在需要的时候存在,否则你必然会像你观察的那样陷入缓存陷阱。 (此外,上下文实际上并非 在需要时实例化它是非常耗时/资源密集的。)

如果你真的必须保持活着,你可能想要查看将上下文传递给辅助表格。

从我的评论中反映出来,认为它最适合作为答案

答案 1 :(得分:0)

首先,布拉德说。只保留特定工作单元的上下文并进行处理。不这样做只会导致头痛。

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

public void Refresh( RefreshMode refreshMode, IEnumerable collection )

关闭Context的方法。此外,您可以检查输入状态。

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