2013-05-30 50 views
0

我有一个WPF项目设置为通过Visual Studio Express 2012 for Desktop中的ADO.NET实体数据模型使用本地SQL Server Compact数据库。该项目运行良好,第一次运行时我可以加载所有数据,随心所欲地操作它,稍后再将更改后的数据放回原处。WPF + SQL Server Compact调试和部署

我注意到,虽然对VS可见的数据只做了一小部分重构,但这只是我在创建数据库时手动输入的第一位数据,而下一次我编译了自从我添加的所有数据失去了!

经过一番深入的研究,我得出结论:应用程序的编译版本使用通过文件的Content:Copy If Newer构建动作发送到bin/Debug文件夹的SDF文件。这意味着可能有多达4个不同的数据库副本需要担心:项目文件夹,调试文件夹,发布文件夹以及最终用户PC上的部署副本。

我希望在我的开发机器上有一个单独的副本,可以通过ClickOnce安装在最终用户的PC上,由调试和发布编译版本以及VS中的数据库资源管理器访问。我想我可以在开发过程中将连接字符串更改为绝对路径,并希望在发布进行部署前,我可以记住将其更改回相对路径。

最后,我预见还需要为这个应用程序发布更新,并且担心如果这样的更新会在最终用户的数据执行不当时抹去最终用户的数据。如果可能的话,我希望只有在我发布更新时才能更新最终用户数据库的架构,而不必触摸数据本身。如果这是不可能的,那么可以接受,我只需要确保在第一次部署之前将所有可以考虑的结构放入数据库中。

总之我的问题有以下几点:

  1. 如何分享VS,调试和发布之间的单个SQL压缩数据库?

  2. 如何在应用程序部署和更新期间处理本地数据库,可选择更新数据库模式而不擦除数据的能力?

+1

您也可以编程方式创建数据库以完全控制。 – ErikEJ

+0

这可以工作。有没有这样的例子?如果可能的话,我想维护类的使用EF和数据源的绑定。 – CuddleBunny

回答

1

我有一个类似的应用程序,我保持数据库文件完全分开。因为您可能还需要执行不希望覆盖用户数据库的更新。我有一个在EF连接发生之前检查数据库模式的进程。所以当我的用户安装这个应用程序时,它需要他们从我的网络服务器上下载数据库文件,并将它放在他们计算机上的特定位置。

+0

我想我可以将数据库文件发送到AppData或其他东西。你能否详细说明你提到的模式检查过程? – CuddleBunny

+1

当应用程序启动时,我检查以确保文件存在。然后,我让它检查任何模式更改,例如,如果我添加一列到我的开发数据库中的表,然后我只检查该列,如果它不在那里,我做一个sqlCE命令添加列,并在一些在尝试使用EF连接之前,案例会更新列中的值。这可能看起来像启动程序的开销很大,但从长远来看,更容易让我的数据与我的客户保持同步,并且仍然允许他们保留数据库的个人部分不被覆盖。 –

+0

好的,我并不太担心EF不同步,因为它应该包含在我发送的更新中。我还不清楚的是以下情况:SomeUser具有Schema1和Data1的SomeDatabase。然后,我将我的SomeDatabase副本更新为Schema2。我必须做些什么才能创建一个更新,将更新SomeUser的数据库到Schema2,使Data1完整无缺(除非当然删除了列)? – CuddleBunny