(事先聲明,我對.Net非常之不熟悉,同時英文水平很差,所以我所理解的各個O/R Mapping產品特性也許是錯誤的,希望有人能夠指證出來,也好讓我改正錯誤,所以這些寫出來的東西可能是錯的,但是說錯並不可怕,只要你說過了)
O/R Mapping在Java世界是盡人皆知,而.Net下也越來越被大家所關注,同時這類產品也已經出來了不少,我想就某些比較流行的方案說一下它們各自的特性和缺點,同時會穿插我本來對O/R Mapping的理解和期望,同時也表示我正式開始.Net下的軟體開發。
我也許會繼續寫下去,也許不會,看時間而定了,我主要比較的特性分以下幾個方面:
DB->Class or Class->DB
多資料庫支援
Mapping方式
關係映射
實體類的複雜性
實體集合返回方式
Null值處理
Lazy-loading
Session管理
交易處理
Cache
OQL語言支援
Criteria查詢構造
部分屬性查詢和運算式構造
資料繫結支援
BLOB支援
其它資料對象的映射支援(sp、view)
計算欄位的支援
批次更新和累加式更新操作的支援
大家最近談得比較多的XPO,那麼就它先吧。(未完,因為要睡覺了)
O/R Mapping之XPO
出品:Dev Express
最新版本:1.5
1、DB->Class or Class->DB
XPO兩者都支援,但它更像是一個Class->DB的持久化方案,因為它的session支援根據class直接產生資料庫schema。
2、多資料庫支援
內部實現中XPO同樣抽象出了資料訪問層,理論上它可以支援任何資料庫,雖然目前只支援MSSQL和Access。
但是從它定義的ConnectionProvider來看,它對資料庫的特性支援非常有限。
3、Mapping方式
因為是.Net下的持久層,所以XPO也不例外地使用了自訂屬性來處理映射,同時支援最小情況下的無須任何屬性便可完成映射(當時實體類要繼承基類)。它的映射可以支援:名稱映射、索引建立、選擇性映射、關係映射、實體類繼承、串聯更新、遲載入、鎖定類型、NULL處理等功能,基本上可以滿足CRUD和類之間的關係維護。因為XPO偏重的是Class->DB,所以它並沒有提供類代碼產生器。
4、實體類的複雜性
實體類必須從XPO的實體基類上繼承,以實現實體類的狀態管理,這樣做的好處是可以直接調用實體類的save來實現持久儲存資料。XPO有一個預設的session,而且當實體類沒有明確指定session時,一切對象的儲存都會調用預設的session.save來完成,而這個預設的session又有一個預設的Access的ConnectionProvider,它可以自動完成資料庫Schema的構造工作,所以有時候XPO的tutorial看上去就是那麼的"簡單":定義實體類->建立實體類->調用實體類的Save。
5、CRUD
這是O/R Mapping最基本也是使用得最多的一個功能了,XPO在這一點上做得還算是中規中矩。但是:
(1)它因為沒有使用代理機制攔截屬性賦值,所以它無法實現只對修改過的值進行操作,在儲存時所有可持久化屬性都將被更新到資料庫中,這點在多點並發情況下是致命的。
(2)它居然無法通過主鍵來retrive資料,只能通過XPCollection或XPCursor來獲得,每次都寫Critiria來查詢資料,多累啊!(經Yok指證,可以通過session.getobjectbykey實現)
6、實體集合返回方式
Dev在這個處理和我一直以來的處理方式的表現形式非常相似,它利用XPCollection和XPCursor來實現實體集合和資料集的封裝,前者是一個”重量級“的集合,但在這個集合中的資料都會一直存在緩衝中,並且支援大量操作;而XPCursor就比較輕了,它可以通過PageSize來設定頁大小,從而每次只裝載當前頁到一個XPCollection中以供遍曆。
為什麼我只說是表現形式和我的處理方式相似呢,因為我在處理資料集封裝時是一直重用一個實體類執行個體,但是XPO因為需要維護記憶體對象,抑或是.Net下對象開銷比較便宜吧。