桌面应用程序,可以在与SQL Server无连接时脱机工作

时间:2016-10-14 19:21:49

标签: c# sql-server wpf entity-framework entity-framework-6

我正在设计WPF桌面应用程序并使用Entity框架Code First来创建和使用SQL Server数据库。我的数据库将托管在One Server计算机上,并将以24 * 7运行。

我想提供一个功能,您可以离线修改数据(当您没有与SQL Server数据库连接时)并以某种方式保存它。每当您的应用程序找到与SQL Server的连接时,所有更改都可以移动到SQL Server DB。

有没有办法通过使用实体框架来实现这一目标? 我想强调我正在使用的部分实体框架。 EF已经实现了这种功能吗?或者我必须手动完成,比如必须在任何文件系统中编写,然后手动将其合并到DB中?

3 个答案:

答案 0 :(得分:0)

您可以找出SQL Server连接丢失时生成的特定异常,并将您的调用嵌入到try-catch块中。如果服务器处于脱机状态,则在catch块中,将实体传递给将实体序列化为JSON的方法,并将其保存到特殊目录中的硬盘驱动器中。在下一次成功查询时,请检查该目录以查看是否有任何需要保存的已保存实体。

特定于您的捕获 - 您不希望不相关的异常触发此代码。

要注意的一些事项 - 如果其他人在此期间更改数据会怎么样?您打算覆盖这些更改吗?如果您处于离线状态,您是如何获得需要首先保存的数据的?

答案 1 :(得分:0)

只要您将所有数据加载到DbContext / ObjectContext中,您就可以随意修改这些数据。只有在调用SaveChanges()时,才真正需要连接。

但是,如果您要将所有内容加载到上下文中,您似乎重新实现了DataSet功能,此外,它还允许对更改进行xml序列化/反序列化,因此甚至可以在会话之间保存更改。

不像EF那样时髦,但是:)

答案 2 :(得分:0)

虽然我从未尝试使用基于SQL的数据,但我过去使用过基于文件系统的数据,而且它是一种主要的蠕虫病毒。

首先,您必须有一些方法来指示需要在本地存储哪些数据,以便在您离线时可用。这需要一直或在你出门之前更新 - 这可能涉及大量的数据传输。

其次,一旦你重新上线,必须要做很多冲突解决。如果在您外出时其他人可能已经更改了数据,您需要某种方法来检测冲突并提示用户在该情况下该做什么。这几乎肯定需要一个系统,可以对可以合理更新的每个数据单元保持详细的编辑记录。

在我的情况下,我非常幸运,几乎可以肯定,如果远程用户编辑文件[x],覆盖系统副本是正确的做法。远程用户只会携带与其项目相关的文件,不应发生冲突。因此,回写仅仅基于时间戳,仅此而已。现场人员通常不需要修改的数据是通过甚至不看它来处理的,修改后的文件只是从系统复制到笔记本电脑。

这留下了中间步骤 - 保存挂起的写入。我不同意Elemental Pete在这方面的答案 - 只是序列化它们并保存结果它们工作,因为当你再次读回数据时会发生什么?你看到旧的副本,而不是改变的副本!

我对此的处理是所有相关数据的本地存储,其访问方式与主系统数据完全相同,所有读取和写入都正常工作。

如果您的数据需要涉及交易,可能需要更多的东西。

请注意,我们还遇到了一个令人讨厌的人类问题:更新过程需要几分钟(注意:> 10年前),只需分析需要完成的工作,而不是计算任何实际的复制时间。结果是人们在他们认为可以的时候绕过它。有时他们认为错了,哎呀!