POCO可以用于什么?

8

我已经阅读了一些有关POCO在实体框架中的文章,但仍然不明白它可以用来做什么。POCO如何为我的项目带来益处?


POCO 大多是指一个简单的类,用于反映数据库中的数据,换句话说,它就是一个数据容器(DC)。 - Peter
4个回答

22

POCO是“Plain Old Clr Object”的缩写。它是一种ORM架构风格,其中所有持久化和从数据存储中加载数据的工作都由系统完成,而对象本身并不知道发生了什么。这意味着ORM可以支持完全普通的对象,这些对象在没有针对ORM进行任何修改的情况下就可以使用。支持持久化POCO的ORM不需要您的类继承任何特定基类、实现任何接口,甚至不需要给方法打上任何属性标记。

完全相反的情况(有时称为数据访问对象-或DAO)是对象本身处理所有的存储,它知道如何序列化和存储自己以及在需要时如何加载自己。在这种情况下,对象应该仅用于传输数据,不应代表系统中的任何业务逻辑。

实际上,这更像是一个光谱,两种情况在两端。许多ORM处于中间位置,要求持久性在类外部处理,但通常也需要在被持久化的类上实现一些元数据或接口来帮助事情顺利完成。

EF(v1)不支持POCO。对象必须实现各种接口(以提供属性值更改等通知)才能被框架持久化。我相信有一些附加框架试图向EF添加POCO支持,但我不知道它们的成功情况如何。在.NET 4.0中的EF将支持POCO

POCO通常被认为是很好的,因为它允许强烈的关注点分离。您可以定义数据对象,完全不知道将用于存储它们的机制(所以在未来更换存储机制变得容易)。这也意味着您不必考虑用于存储数据对象的数据库/框架的任何考虑。


1
我认为你对DTO的定义是错误的 - 它们应该与POCO / POJO非常相似。 DTO是一个没有行为的存储对象。也许你想到的是DAO(数据访问对象)? - Bryan Batchelder

6

POCO指的是“普通的CLR对象”,它只是一个标准类,任何标准类都可以。

在EF方面,人们指的是能够配置EF将您自己的类(不是直接由EF生成的)存储到数据库中。


1

POCO只是一个普通的类,没有添加任何接口或基类来使其与您的数据库层(在此上下文中)配合使用。

优点如下: 1)不依赖于特定的数据库层,因此您可以将其替换为更好的数据库层(例如NHibernate),而无需修改除数据库层以外的任何内容。

2)它使单元测试类更容易。
3)没有样板代码来通知属性何时已更改等,只有简单的getter和setter。
理想情况下,您的领域对象是从ORM加载的,而该对象不必对其加载方式、更改跟踪方式或保存方式等发表任何意见。
NHibernate在这方面做得非常好,唯一的要求是您必须使所有属性/方法虚拟化,这比任何硬依赖都要好得多。


-5

POCO是为了在应用程序内部传输数据而设计的类(即将数据从数据层移动到UI层)。它们还将应用程序的结构与数据库模式解耦。

在小型项目中,这并不是什么大问题,但随着项目的增长,对象模型(如何设计您的POCO)往往会偏离数据库模式。

在.Net中通常使用的其他方法是DataTables和DataSets。通常通过使用列名来检索数据。这将使您的代码与数据库中的列名耦合。如果数据库中的列名更改,则您的代码将出现错误。


1
我有点不喜欢将POCO称为DTO。抱歉 :) - Arnis Lapsa

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