Asp.net 如何实施";“获取最新更改的项目”;使用ADO.NET数据服务?

Asp.net 如何实施";“获取最新更改的项目”;使用ADO.NET数据服务?,asp.net,wcf-data-services,change-management,change-tracking,Asp.net,Wcf Data Services,Change Management,Change Tracking,假设我有一个多个用户可以同时更改、删除和添加的实体列表(例如,TODO项目列表) 因此,为了维护所有客户端之间的同步列表,我希望每个客户端(基于AJAX)每xx秒请求一次更改。由于列表可能会很长,我不想每次都做一个完整的请求,而只要求更改的项目(项目可以更新、删除或新建) 是否可以使用ADO.NET数据服务?如果是这样,如果我在服务器上使用实体框架,我该如何实现它 我考虑过在将更改操作提交到数据服务时使用ASP.NET缓存来存储更改项,并使用自定义web方法返回自特定客户端上次请求以来的最新更改

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

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

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

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

一个很好的解决方案还可以让客户机在到服务器的同一往返过程中请求对多个实体进行更改

任何输入都会得到很大的响应


致以最诚挚的问候,艾吉尔。

我脑海中浮现的方式是在桌子上使用一代人编号。为TODO表指定一个名为generation的列,并(精神上)与之关联一个全局和持久的generation number变量。(最好将其放在数据库的表中)

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

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

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


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

感谢Christopher的输入。您的想法肯定会奏效,但我希望将更改管理排除在数据库之外,在我的世界中,它与客户机相关,与数据并不真正相关。也许您可以使用基本相同的方案,而无需使用数据库,方法是将结果集缓存在global.asax中,并将generation字段等添加到结果集中。然后,您可以在会话或JS中缓存客户端的生成号,以获取更新/插入/删除。我确实需要将数据存储在数据库中,但如果我可以动态修改结果集,那就太好了。我不知道EF是如何允许我这么做的。嗯。。。您能否使用分部类将额外的“字段”实现为数据模型中的附加属性。它们不会被保存在数据库中,但只要对象在全局缓存中,它们就会一直存在。嗯,是的,好主意。然后,我可能需要包装实体框架数据上下文,以便在数据到达DS之前更新数据。无论如何,谢谢你的投入!