假设我有一个实体列表(例如,TODO 项目列表),多个用户可以同时对其进行更改、删除和添加。

因此,为了维护所有客户端之间的同步列表,我希望每个客户端(基于 AJAX)每隔 xx 秒请求一次更改。由于列表可能会变得非常长,因此我不想每次都执行完整的请求,而只想请求更改的项目(项目可以更新、删除或新建)。

ADO.NET 数据服务可以吗?如果是这样,如果我在服务器上使用实体框架,我该如何实现它?

我考虑过在将更改操作提交到数据服务时使用 ASP.NET 缓存来存储更改项,并有一个自定义 Web 方法,该方法将返回自特定客户端上次请求以来的最新更改(可以通过客户端跟踪请求) ASP.NET 会话对象)。但是,我不知道如何指示单个项目的更改状态(例如删除或更新或插入)在结果集中。

一个出色的解决方案还将使客户端能够在与服务器的同一次往返中请求许多实体的更改。

任何意见将不胜感激。

最好的问候,埃吉尔。

有帮助吗?

解决方案

我想到的方法是使用表的代号。为 TODO 表提供一个名为“代”的列,并(在心理上)将其与一个全局且持久的代号变量关联起来。(可能最好将其放入数据库的表中)。

每次进行更新或插入时,生成编号都会递增并放入更新或插入记录的生成编号列中。

当第一次从数据库读取记录并将其放在网页上时,也会检索当前生成编号并在本地缓存(即放入 JavaScript 变量中)。后续 AJAX 驱动的读取使用 where 子句,该子句仅过滤生成编号大于本地缓存生成编号的记录。这可确保仅检索新的更新和删除。然后更新本地缓存的代号。

删除有点棘手。一种方法是在有限的时间内(例如 21 分钟)对已删除的记录进行逻辑删除。您有一个名为墓碑的位列和一个日期时间列。删除记录时,列会以与插入或删除相同的方式设置其生成编号,设置逻辑删除位,并使用 GetDate() 将日期时间设置为当前时间。然后,客户端的 AJAX 请求可以选择设置了逻辑删除标志的记录并将其从客户端列表中删除。如果对客户端进行编码,以便每 20 分钟执行一次全页刷新或获取每条记录的 ajax 调用,那么数据库作业可以每分钟运行并清理(即删除)超过 20 分钟的逻辑删除记录。

编辑:实际上,您不需要单独保留生成编号,您可以对生成列使用sql函数MAX。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top