2009-10-29 88 views
8

我已經閱讀了有關POCO在Enttity框架中的一些文章,但仍不明白我可以使用它。 POCO如何使我的項目受益?我可以使用POCO做什麼?

+0

一個POCO或多或少只是一個簡單的類來重新從數據庫中的數據換句話說它的DC(數據容器) – Peter 2009-10-29 23:21:12

回答

21

「普通舊Clr對象」的POCO標準。它指的是一種ORM體系結構,其中用於持久化和加載數據存儲中的數據的所有工作都由系統完成,而對象本身不知道正在發生什麼。這意味着ORM可以完全支持沒有以任何方式修改ORM的對象。支持POCO持久化的ORM不要求你的類從任何特定的基類繼承,實現任何接口,甚至標記具有任何屬性的方法。與此完全相反(有時稱爲數據訪問對象 - 或DAO)是當所有存儲都由對象本身處理時,它完全知道如何序列化和存儲自身以及如何在需要時加載自身。在這種情況下,對象應該純粹用於傳輸數據,而不應表示系統的任何業務邏輯。

實際上,這兩個情況在任何一端都是更多的光譜。許多ORM位於中間的某個位置,需要持續性在課堂外部進行處理,但通常還需要在課程上實施一些元數據或接口以幫助解決問題。

EF(v1)不支持POCO。對象必須實現各種接口(以提供屬性值更改通知等)以便框架可持久化。我相信有addon frameworks試圖增加對EF的POCO支持,但我不知道它們有多成功。 EF in .net 4.0將擁有POCO支持。

POCO通常被認爲是好的,因爲它允許關注的強烈分離。您可以定義您的數據對象,以便完全不知道將用於存儲它們的機制。 (因此,將來可以輕鬆地將存儲機制轉換爲不同的東西)。這也意味着您不必考慮用於存儲數據庫/框架的數據對象來設計數據對象。

+1

我相信你對DTO的定義是錯誤的 - 它們應該和POCO/POJO很相似。 DTO是一種無行爲的存儲對象。 也許你正在考慮DAO(數據訪問對象)? – 2009-10-29 23:44:16

+1

@Bryan:是的,謝謝= :) – 2009-10-29 23:48:43

5

POCO只是「普通舊CLR對象」。這只是一個標準課程,任何標準課程。

就EF而言,人們指的是能夠配置EF來將自己的類(不是由EF直接生成)存儲到數據庫中。

-5

POCO是設計用於在您的應用程序內傳輸數據的類(即將數據從數據層移動到UI層)。它們還將應用程序的結構與數據庫的架構分離。

在小型項目上這不是什麼大問題,但隨着項目的發展,對象模型(您如何設計POCO)往往偏離數據庫模式。

.NET中通常使用的其他方法是DataTable和DataSet。通常使用列名稱檢索數據。這會讓你在數據庫中做列名。如果數據庫中的列名發生更改,則代碼中斷。

+1

我很不喜歡把POCO叫做DTO。抱歉。 :) – 2009-10-29 23:30:47

1

POCO只是一個普通的類,沒有添加接口或基類來使它與數據庫層(在這種情況下)一起工作。

優點是: 1)不依賴於特定的數據庫層,所以你可以將它換成一個更好的(即NHibernate),而不需要修改除數據庫層之外的其他任何東西。

2)它更容易對單元測試你的類。 3)沒有鍋爐板代碼來通知當財產已經改變等只是簡單的getter和setter。

Idealy你的域對象是從ORM加載,而不必在它是如何加載,變化是如何跟蹤任何表示或對象它是如何保存等

NHibernate的在這做了很好的工作,唯一的要求是你必須使所有的屬性/方法變成虛擬的,這比任何硬性依賴關係都要好很多。

相關問題