我需要一些关于使用XML作为小型c#应用程序的数据持久性的好方法的意见。这是一个独立的应用程序,用户不共享相同的数据持久性,因此,文件访问是排他性的。这就是我最初想到XML的原因。
我知道我的设计模式,所以如果我编写通常的层,我可以隔离持久性,然后在需要时更改它。再说一次,这是一个小应用程序,所以我需要快速编写它。
我应该使用Linq to XML,然后结束它吗?如果是这样,如果我决定用嵌入式数据库替换XML,那么我的重写工作将是什么?Linq写入XML文件的性能如何?
但是如果我不选Linq,你们会有什么建议?
根据我得到的评论,我可能需要指定更多一些。这是一个教师使用的成绩单应用程序。这些是我的主要实体:
- 课程
- Teacher(应该只有一个,但我将存储它,因为将来集成的可能性)
- 年级(学生每门课程可以有多个年级)
现在有一些问题:
- 在幕后,我应该每个实体一个XML文件吗?
- 在底层,我应该使用Linq to XML吗?还有什么需要考虑的吗?
和一些注释
- 我明白我应该在输入和输出上使用
IEnumerable<MyEntity>
与"持久性类实例"接口。这给了我灵活性。 - 虽然我真的愿意接受建议,但我现在真的不想考虑嵌入数据库。这个小应用程序是一个令人兴奋的机会,可以在生产中工作和试验新事物(不仅仅是测试)并且风险很小。
我建议你:
- 定义一个模型(一个类)来表示需要存储的数据(可以是分层的)
- 使用序列化序列化或反序列化到XML或二进制甚至JSON如果需要。
使用SQL Server Compact可能会容易得多这样就更容易使用实体框架工具,并在以后有选择地迁移到完全成熟的SQL Server。
如果您一次编写整个文档,XML/JSON效果最好,尝试附加数据也可以,但在某些时候,您可能希望在文档/文件中间插入/更新部分数据,这就是它变得复杂的时候。
如果您可以接受这样的解决方案:将数据读入内存(立即或部分通过查询),然后在稍后的某个时刻将其全部写回文件,那么它与单个XML/JSON文件一起工作得很好。只要您不需要定期地从文件中更新/插入/删除部分数据,就应该由文件来完成(尽管性能可能是一个问题)。
我使用过很多次的一种方法是定义一个XSD Schema,包括你喜欢的约束、数据类型等,然后设置一个预构建步骤,为你自动生成一个可序列化的c#类层次结构(例如使用XSD.exe)。使用普通的XML序列化功能,可以很容易地将整个文档加载到内存中(并可选择通过XSD文档验证XML),读取/操作它(查询/更新/插入/删除),然后将整个对象层次结构序列化回XML。有关XSD.exe的信息请参阅此页。
这种方法很快为您提供了一个非常有用和坚实的基础。这在一段时间内应该是足够的,但是如果您以后转向基于数据库的解决方案,如果您没有从一开始就在内部抽象出数据访问,那么您可能不得不重写相当多的内容。
如果一个纯粹的基于文件的解决方案是不够的,去寻找某种面向数据库的解决方案,最好是某种嵌入式数据库,例如SqlLite或BerkeleyDb。