0

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

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

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

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

一个很好的解决方案还可以让客户端在与服务器的同一次往返中请求对许多实体进行更改。

任何输入都会很受欢迎。

最好的问候,埃吉尔。

4

1 回答 1

1

我想到的方法是使用表的世代号。为 TODO 表提供一个名为 generation 的列,并(在心理上)将其与全局和持久的世代编号变量相关联。(最好将其放在数据库中的表中)。

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

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

删除有点棘手。一种方法是在一段有限的时间内删除已删除的记录,比如 21 分钟。您有一个名为 tombstone 的位列和一个日期时间列。当一条记录被删除时,该列的世代号设置方式与插入或删除相同,设置墓碑位,并使用 GetDate() 将日期时间设置为当前时间。然后,客户端的 AJAX 请求可以选择设置了 tombstone 标志的记录并将它们从客户端列表中删除。如果客户端被编码为每 20 分钟刷新一次完整页面,或者执行获取每条记录的 ajax 调用,则数据库作业可以每分钟运行一次并清理(即删除)超过 20 年的墓碑记录分钟。

EDIT: You actually don't need to separately persist the generation number, you can the sql function MAX over the generation column.

于 2009-04-06T12:03:25.337 回答