C# 实体框架POCO长期变更跟踪

C# 实体框架POCO长期变更跟踪,c#,wpf,ef-code-first,entity-framework-4.1,C#,Wpf,Ef Code First,Entity Framework 4.1,我使用.NETEntityFramework4.1和代码优先的方法来有效地解决以下问题,这里简化了 有一个数据库表,有成千上万个条目 我的程序的几个用户需要能够 在网格行中查看(整个)表,这意味着必须下载整个表 修改任意随机行的值,更改是频繁的,但不需要立即持久化。预计不同的用户将修改不同的行,但这并不总是正确的。允许丢失一些更改,因为用户很可能会将相同的行更新为相同的值 有时会添加新的行 听起来很简单。我最初的方法是使用一个长时间运行的DbContext实例。这个DbContext应该

我使用.NETEntityFramework4.1和代码优先的方法来有效地解决以下问题,这里简化了

  • 有一个数据库表,有成千上万个条目
  • 我的程序的几个用户需要能够
    • 在网格行中查看(整个)表,这意味着必须下载整个表
    • 修改任意随机行的值,更改是频繁的,但不需要立即持久化。预计不同的用户将修改不同的行,但这并不总是正确的。允许丢失一些更改,因为用户很可能会将相同的行更新为相同的值
    • 有时会添加新的行
听起来很简单。我最初的方法是使用一个长时间运行的
DbContext
实例。这个
DbContext
应该跟踪对实体的更改,这样当调用
SaveChanges()
时,大部分腿部工作都会自动完成。然而,许多人指出,从长远来看,这并不是一个最佳解决方案。我仍然不确定我是否理解其中的原因,我也不知道我的场景中的工作单元是什么。用户自己选择何时保存更改,假设客户机总是因为简单而获胜。还需要注意的是,未接触的对象不会覆盖数据库中的任何数据

另一种方法是手动跟踪更改,或者使用跟踪更改的对象,但是我对这些技术不太熟悉,我欢迎朝着正确的方向轻推

解决这个问题的正确方法是什么

我知道这个问题有点含糊不清,但我认为它更基本。我对如何解决这类问题缺乏基本的了解。在我看来,长寿
DbContext
是正确的方式,但知识渊博的人告诉我相反的方式,这会导致我产生困惑和不精确的问题

EDIT1
另一个混淆点是
DbSet
对象上存在
Local
属性。它邀请我使用一个长时间运行的上下文,就像另一个用户发布的那样。

听起来您的用户可以在一段不确定的时间内拥有数据的副本(缓存)。用户使用缓存数据的时间越长,他们在DbContext中与数据库连接断开连接的可能性就越大。我的猜测是EF不能很好地处理这个问题,你可能想处理这个问题。(例如,偶然连接的架构)。我希望实现它可以解决您的许多问题。

长时间运行的上下文的问题是它不会刷新数据-我讨论了更多的问题。因此,如果您的用户在半小时内打开列表并修改数据,她不知道更改。但在WPF的情况下,如果您的业务活动是:

  • 打开列表
  • 你想做多少就做多少
  • 触发保存更改
然后,这是整个工作单元,您可以使用单个上下文实例。若您有最后一次编辑获胜的场景,那个么在其他人删除当前用户编辑的记录之前,您不应该对此有问题。此外,在保存或取消更改后,您应该处理当前上下文并再次加载数据-这将确保您真正拥有下一个工作单元的新数据

上下文提供了一些刷新数据的功能,但它只刷新以前加载的数据(没有关系),因此,例如,新的未保存记录仍将包括在内


也许您还可以阅读有关MS Sync framework和本地数据缓存的信息。

您正在构建什么样的应用程序?它是web还是windows应用程序?@Ladislav Mrnka这是WPF应用程序我不认为你在这一点上是对的。事实上,这只是一个神话。通过DbContext进行的任何查询都可能出现连接故障,始终需要重试逻辑来验证没有发生这种情况。但如果您重试操作,它将获得新连接。神话?只是尝试了一下,创建了一个上下文,得到了一行,导致SQL server断开连接,并在SaveChanges中得到了一个异常。如果您再次执行SaveChanges(),会发生什么?好吧,您应该处理这个异常。例外情况只是一个无用的连接。下次您执行SaveChanges()时,上下文将创建一个新的。就我对推荐指南的理解而言,这是最好的。如果这是真的,那么“你最好的不理解”并不意味着你在猜测;请发布你的消息来源。否则,这就有点傻了。EntityException是唯一的异常抛出——它不能很好地确定异常是否确实是由于断开连接造成的,也不能很好地确定“重试”是否会将应用程序发送到一个无止境的循环中。实际上,您已经为我提供了刷新上下文的方法,在我的场景中,这种方法似乎运行良好。但我宁愿按照你的建议干净利落地做。再次感谢。你能在下面的答案中加入讨论吗?我真的很想知道到底发生了什么。我不知道为什么我这么肯定,这让我质疑一切