Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查实体是否已被删除_C#_Entity Framework - Fatal编程技术网

C# 检查实体是否已被删除

C# 检查实体是否已被删除,c#,entity-framework,C#,Entity Framework,我们首先使用DbContext/Code在winforms应用程序中实现实体框架,并有以下问题,即当实体在另一个上下文中被删除/更新时,如何正确检查/处理该实体 例如,我们有一些辅助表数据(例如StateCodes),用户可以根据需要进入另一个表并添加/删除状态。这个辅助编辑器表单利用它自己的DbContext,并在用户退出表单后保存更改。返回到主窗体时,主上下文不知道对数据库所做的更改,因此我们希望为实体重新加载DbSet。不幸的是,如果我们删除“MI”状态代码,它仍然存在于DbSet的本地属

我们首先使用DbContext/Code在winforms应用程序中实现实体框架,并有以下问题,即当实体在另一个上下文中被删除/更新时,如何正确检查/处理该实体

例如,我们有一些辅助表数据(例如StateCodes),用户可以根据需要进入另一个表并添加/删除状态。这个辅助编辑器表单利用它自己的DbContext,并在用户退出表单后保存更改。返回到主窗体时,主上下文不知道对数据库所做的更改,因此我们希望为实体重新加载DbSet。不幸的是,如果我们删除“MI”状态代码,它仍然存在于DbSet的本地属性中,EntityState为unchanged,即使在我们调用“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);
    }
}

感谢您的帮助

您不应该让上下文超过其工作单元。上下文应该只在它需要的时候存在,否则您必然会遇到缓存陷阱,就像您正在观察的那样。(此外,上下文并没有那么繁重,因为在需要时实例化它会非常耗时/资源密集)

如果您真的必须让它保持活动状态,那么您可能需要将上下文传递给辅助表单


从我的评论中可以看出,我认为最好先回答一下布拉德说的话。仅保持特定工作单元的上下文处于活动状态,并对其进行处理。不这样做只会导致头痛

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

公共无效刷新(
刷新模式刷新模式,
IEnumerable集合
)

方法脱离上下文。此外,您还可以检查输入状态


谢谢您的回复。如果我理解正确,那么下面的逻辑可能是我们最好的选择:用户单击以编辑辅助数据--在当前上下文上调用SaveChanges--处置当前上下文并向用户显示编辑器--返回后,重新实例化上下文并再次执行数据的初始加载。@nundaddy:是。尽管我认为您应该在操作中创建上下文,例如
buttonnclick(){using(context c=new context()){c.Entities.Add(e);c.SaveChanges();}}}
您能否详细说明一下创建每个操作内部的原因。我之所以这么问,是因为我正试图通过一些主-细节关系在整个主表单中实现数据绑定。如果我在每个操作中创建一个上下文,我想我将不再能够真正依靠数据绑定进行更改跟踪,对吗?@NuNnDaDdY:你将比我更了解应用程序。EF的优点在于它们是POCO,所以除非您不断地进行数据库调用,否则可以在它们自己的范围内存储和操作实体,然后在必要时执行CRUD。但是,如果您正在使用某种形式的MVVM,并且希望自动应用更新,那么可以保持上下文的活动性。这完全取决于您如何实现它以及应用程序的功能。我只是在演示,除非执行数据库操作,否则上下文不必保持活动状态。感谢您帮助澄清问题。我将与其他开发人员讨论这个问题,并研究您提出的建议。祝你有美好的一天!