【问题标题】:Check to see if Entity has been Deleted检查实体是否已被删除
【发布时间】:2012-12-20 16:39:22
【问题描述】:

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

感谢您的帮助

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

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

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

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

    【讨论】:

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

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

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

    public void Refresh( RefreshMode refreshMode, IEnumerable collection )

    脱离上下文的方法。也可以查看入口状态。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-10
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多