如何使用实体框架处理长时间运行的操作?

Mob*_*isk 5 c# entity-framework

我们的团队正在开发一种机器,该机器将在装有医疗样本小瓶的托盘上执行物理过程。物理过程大约需要 1.5 小时。托盘和相关小瓶是实体,使用实体框架从数据库加载。随着流程的运行,设备将更新实体上的值。这些变化可能相隔几分钟或几秒钟发生。在某些步骤结束时,相隔 10 到 45 分钟,我们希望将这些实体保存回数据库,然后继续。

实体框架上下文打开 1.5 小时是否可以接受?我可以使用该上下文在该时间段内多次更改和保存实体吗?如果没有,处理这个问题的最佳方法是什么?

到目前为止的一些想法:

  • 我们可以使用附加/分离功能。这应该允许我们对上下文之外的实体进行更改,然后创建一个新的上下文并在我们想要保存时附加实体,然后将其分离以继续工作。
  • 每次我们想要更改实体之一时,我们都可以创建一个新的上下文。但我不认为我们每次进行更改时都想保存。
  • 我们可以将实体复制到业务对象,并在那里进行更改。然后当我们想要保存时,我们会打开一个上下文并将更改复制到实体中,然后保存。

Tra*_*s J 3

2 和 3 的组合将是理想的。

首先,不要让上下文一次打开几个小时。您可以通过配置来完成此操作,但考虑到您正在执行 90 分钟的操作并且打开连接大约需要 3 毫秒,这只会浪费资源。

因此,只需根据需要创建一个上下文即可。接下来,请记住,虽然您打开上下文来收集数据或维护状态,但如果数据尚未准备好存储,则实际上不需要保存数据。您只需将其存储在本地即可。

这就是步骤 3 的用武之地,即本地内存。基本上,您应该将其保存在本地内存中,并附加一个事件处理程序。当本地副本发生更改时,如果更改发生在某个可接受的时间范围内,则更新数据库。