检查是否已删除实体

本文关键字:实体 删除 是否 检查 | 更新日期: 2023-09-27 17:49:15

我们正在使用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);
    }
}

谢谢你的帮助

检查是否已删除实体

您不应该让上下文超过它的工作单元。上下文应该只在需要的时候存在,否则您一定会遇到缓存陷阱,就像您正在观察的那样。(此外,上下文真的不是那么重,当你需要实例化它时,它是非常耗时/资源密集的)。

如果你真的必须保持它的活性,你可能需要考虑将上下文传递给辅助形式。

从我的评论镜像,认为它最好作为一个答案

首先,Brad是怎么说的。仅为特定的工作单元保持上下文活动并处理它。不这样做只会让你头疼。

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

public void Refresh( RefreshMode refreshMode, IEnumerable collection )

从上下文中删除

方法。此外,您还可以检查条目状态。

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