使用POCO相对于使用DataTables有哪些优势?

7
在数据访问层中,查询数据库并返回结果的可枚举对象时,返回一组具有属性名称、年龄等属性的Dog对象列表,相比于返回包含“姓名”、“年龄”等列的DataTable,有哪些优势?

3
POCO提供了一个Dog对象列表,其中包含属性名称、年龄等,而不是像“名称”、“年龄”等列的DataTable。 - John Saunders
4个回答

9

一些特点:

  • 类型安全
  • 不仅可以序列化为XML,还可以序列化为JSON、二进制等格式
  • 易读性好
  • 更轻量级
  • 支持添加行为
  • 支持定义数据注释和验证逻辑
  • 支持使用ORMs(对象关系映射)

当你提到序列化时,你是指 .NET 自动序列化 POCOs 的能力,但它不知道如何序列化 DataTables 吗? - Brian Smith
没错。POCO的序列化是自动的,你只需要使用正确的序列化器即可。 - Aliostad

7
如果您使用普通的DataTable,您会发现到处都是神奇字符串(即使您使用常量)。提取值的代码变得笨拙且容易出错,基本上是因为您不得不在您真正试图表达代码的地方提供数据(名称、表达式等)。
每次调用DataTable.Select或DataTable.Sort,或访问DataRow索引器时,想象一下如果您使用强类型模型会有多少减少冗余和减少潜在错误的可能性。当然,这可以是强类型数据集,但是即使如此,我发现使用POCO通常会更加顺畅。
此外,与DataTables相比,POCO通常需要更少的代码来测试代码。

听起来POCOs更优秀。为什么有人还想使用数据表呢?它们只是过去的遗物吗? - The Muffin Man
1
@TheMuffinMan:不完全正确...如果你实际上除了在网格中显示数据之外不需要对数据进行任何操作,那么使用DataTable更简单。或者如果你正在使用具有动态形状的查询。如果你习惯于Json.NET,就像使用JObject而不是反序列化到特定类一样。 - Jon Skeet
1
@TheMuffinMan 写一个类,可以表示一个 CSV 文件,但有多个文件,就像带有工作表的 Excel 一样... 所以行,检查,列,检查,现在如何存储未知类型的列... 请向我展示“POCOs”如何实现这一点。你所说的是当你有一个已知的数据/类型结构时。建立一个 CSV 映射器,其中 CSV 是动态和灵活的。所以它们并不优越,它们在不同的情况下使用。 - Seabizkit

1

如果您使用对象而不是 DataTables,则可以获得强类型结果,并使使用数据的代码更加清晰。您不必拥有各种字符串来访问应该只是对象属性的内容。

此外,如果您使用像 NHibernate 这样的 ORM 工具,则可以直接从数据库映射到您的对象,而无需手动调用数据库并处理 SqlCommand 等。


0

它将您的业务逻辑与持久层分离。

因此,您的“Dog”对象以及大部分使用它的代码只需关注狗和狗的特性,而不必担心哪种数据访问方式是本周流行的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接