2014-01-20 86 views
0

我有一个使用实体框架的WPF应用程序。我将实施一个存储库模式,使与EF的交互变得简单并且更易于测试。多个客户端可以使用此应用程序并连接到相同的数据库并执行CRUD操作。我试图想出一种方法来在对数据库进行更改时同步客户端存储库。任何人都可以给我一些关于如何解决这类问题的方向,以及一些对这类问题有利的可能模式?保持存储库与多个客户端同步

我会对任何有关如何保持客户端同步的信息/书籍非常开放,甚至会警惕其他客户端正在做的事情(我唯一能想到的是让服务器进程运行并传递消息) 。谢谢

回答

1

到目前为止,让每个客户端UI保持最新的最简单方法就是每隔一段时间刷新一次数据。如果确实如此重要,您可以设置一个DispatcherTimer以便在您获取正在显示的最新数据时每分钟打勾一次。显然,我并不是建议刷新正在编辑的项目,但是如果您获得新的数据,您当然可以将收藏与当前正在显示的项目进行比较。与其替换新的旧收藏品,您可以更方便用户,只需添加新的收藏品,删除已删除的旧收藏品并更新新的收藏品。

您甚至可以检测出当前用户打开它并提醒他们这一事实后,当前正在编辑的项目是否已被其他用户保存。因此,您不应该专注于某个系统来跟踪所有数据更改,而应该努力检测两组数据之间的变化,然后将其无缝集成到当前UI状态。


UPDATE >>>

是绝对没有从您的应用程序(或仓库)持有一套完整数据的好处。实际上,由于额外的RAM要求,您可能会发现它会增加有害影响。如果您每隔几分钟轮询一次数据,那么它始终是最新的。

因此,不要一直询问所有的数据,只需要询问用户想看什么(取决于他们当前使用哪个视图)并且不时更新它。我通过简单地获取视图首次打开时所需的相同数据来完成此操作。我写了一些方法,比较每个项目的每个属性与用户界面中的旧对象的属性,并将旧对象换成新对象。

Equals方法认为......你可以做这样的事情:

public override bool Equals(Release otherRelease) 
{ 
    return base.Equals(otherRelease) && Title == otherRelease.Title && 
     Artist.Equals(otherRelease.Artist) && Artists.Equals(otherRelease.Artists); 
} 

(不实际使用的Equals方法虽然,之后你会遇到的问题)。然后是这样的:

if (!oldRelease.Equals(newRelease)) oldRelease.UpdatePropertyValues(newRelease); 

和/或本:

if (!oldReleases.Contains(newRelease) oldReleases.Add(newRelease); 

我猜你现在明白了。

+0

谢谢。这很有道理。我很好奇怎样才能看到哪些新实体已经被添加到EF中的数据库中。如果我要正确理解存储库模式,请使用我的“客户”回购。将拥有所有的EF客户实体,并且回购将每隔一段时间轮询一次数据库并找到新客户。如何检测数据库中的新实体与我的回购清单目前具有什么功能?谢谢! –

+0

感谢您的更新。这一切都非常有意义。我想我的存储库实际上存储了什么问题,以及为什么保留用户在内存中访问的内容,如果他们不再需要这些内容是有益的。 –

相关问题