【问题标题】:.NET Dual persistence architecture.NET 双持久性架构
【发布时间】:2011-04-12 08:38:05
【问题描述】:

我面临着编写对象持久性机制的挑战,该机制将序列化/反序列化为 SQL 数据库和 XML 文件。

为了便于说明,假设我有一个具有单个根对象的对象图。例如,可能是一棵“树”,它有各种各样的子对象——树叶、树枝、坚果、松鼠、鸟类等等。

我需要一个架构的建议,该架构可以在从文件和/或数据库加载和保存“树”之间无缝移动。它需要能够从文件中加载“树”并将其保存到数据库中,或者相反。

我目前正在使用 Entity Framework 来实现我的 SQL 持久性,对此我很满意。对于 XML,我使用的是 XDocument,我也非常喜欢它,但我想知道是否没有一些框架已经完成了所有这些工作。

【问题讨论】:

  • 在 SQL Server 中使用 XML 列有什么问题?
  • 我应该注意到这是一个项目的结尾。最初的规范仅针对 SQL 持久性,并且在这条道路上已经完成了大量工作; SQL 持久性工作正常。现在添加了一项要求,即能够将同一组实体加载/保存到文件中,同时仍保持 SQL 功能。我试图在不对现有工作进行大规模重新设计的情况下满足这一要求。
  • xml 文件格式是必需的吗?与 Fatal 提到的类似,您可以使用基于私有文件的 Sql Server Compact 部署,它只是一个基于本地文件的数据库(不需要安装或任何东西)。您将使用 EF 与之交互,因此它对您的应用程序的影响最小。几乎就像将上下文与不同的连接字符串一起使用一样简单。

标签: c#


【解决方案1】:

除非您想在 Sql Server 中查询您的对象(或有其他可能更新/管理关系数据的源),否则使用 E​​F 转换为关系模式有点矫枉过正。如果您只想将对象图保存在不同的介质中,那么您应该考虑运行时序列化或 DataContractSerializer。从本质上讲,您将获得可以转储到包括 Sql Server 在内的任何存储介质中的二进制数据或 XML。当您的对象结构发生变化时,这将使您免于更改 sql server 中的关系模式。但是,在采用序列化方法时,您必须考虑对对象进行版本控制。

【讨论】:

    【解决方案2】:

    您可以尝试使用旧的但非常好的XmlSerializer

    ps。在将您序列化的对象加载到 xml 文件时,需要注意 Entity Framework 可能要求您提供的任何内容。

    【讨论】:

    • 同意,是否存在阻止您使用任何自动 XML 序列化/反序列化的特定问题?
    • @Alex 从我的脑海中,你需要有一个无参数的构造函数。在某些情况下,当您有一个成员是可以在其中包含子类的列表的任何变体时,您需要添加额外的属性。要获得更完整的列表,我会搜索 stackoverflow 并发布一个问题(如果之前没有被问过)。
    • 好吧,DataContractSerializer 更加健壮。 (此外,XmlSerializer 可以很好地处理列表,但字典可能会带来问题)。并且有很多开源序列化器 - 例如 code.google.com/p/nserializer
    • @Alex 这是一个很好的观点。如果你有一个链接,那就太好了。在堆栈上快速搜索:stackoverflow.com/questions/2505778/…stackoverflow.com/questions/883289/… --- 也可以到 danrigsby.com/blog/index.php/2008/03/07/…
    • 那些链接还不错。不过,也许我不是在这方面提出任何建议的最佳人选,因为除了微不足道的 XmlSerializer 之外,我不需要任何其他东西。
    【解决方案3】:

    对以 XML 格式保存的实体有严格的要求吗?如果没有,当您需要本地/文件系统持久性时,另一种选择可能是在实体框架中使用 SQLite (http://sqlite.phxsoftware.com/)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2021-07-23
      相关资源
      最近更新 更多