2009-05-05 56 views
4

我正在查看.NET ORM實現,並且我有一個主要的燃燒問題 - 是否有任何.NET ORM實現不需要數據庫中每個字段的公共屬性?當我看到像this這樣的例子時,我的腦海中響起一個小鐘。 I 堅決相信封裝,並被迫打開我的對象的和服只是爲了使他們與持久性框架很好地工作給了我heebie-jeebies。所有ORM都需要這種可訪問性嗎?如果沒有,指向那些不需要它的例子!ORMs和構造函數

回答

6

NHibernate支持類成員的多種訪問策略。公共屬性是事實上的默認值,但你可以告訴NHibernate直接訪問你的類的字段。

例如

<property name="CustomerName" access="field.camelcase-underscore" /> 

將指示NHibernate的在你的聲明如下類使用領域:

protected string _customerName; 
+0

我打算回答完全相同的事情。 :) NHibernate也不需要你有一個公共的默認構造函數。如果你不想有一個公共的默認構造函數,你可以簡單地將它設爲私有。 (你必須定義一個,這樣NHibernate可以創建你的類的一個實例,但它完全可以是私有的)。 – 2009-05-05 21:35:42

0

你的意思是你想給私人或受保護的成員映射到數據庫中,而不是讓他們都公開?我使用過的一個ORM可以做到這一點,就是Gentle.NET。這是穩定的,但並沒有真正獲得許多更新這些天。

+0

這正是我需要的 - 就像我提到的那樣,我對封裝有非常強烈的信念,但有時候應該存儲私有字段。 – 2009-05-05 21:33:01

1

實體框架支持這一點。您可以爲每個屬性定義訪問修飾符,並獨立地爲getter和setter定義訪問修飾符。

1

Mindscape LightSpeed僅綁定到字段 - 只爲您希望顯示的字段添加屬性(這是僅限於的方式,因爲封裝的明確原因)。當然,工具將默認提供屬性,但它可以全部關閉。

Mindscape LightSpeed O/R Mapper

-1

的LINQ to SQL可以綁定到私人領域,但它確實但是完全支持私人蔘數的構造函數。

0

Harper - 我感覺Linq-To-SQL的方式幾乎一樣,直到我意識到這一切都是關於如何考慮ORM的......它有助於將Linq2SQL視爲「強類型的ADO .NET提供者「...

如果你只是想在幾個字段上」快速查看「,那麼LINQ預測會返回匿名類型給你,它只包含你感興趣的字段。 實體類的大小與您查詢的網絡和內存性能無關。

另一方面,DataContexts(或其他ORM中的UnitOfWork)通常是您儘可能快地使用和處置的東西。因此,它們所產生的實體的作用應該僅限於「數據持有者」。換句話說,如果你想要構建複雜或長期生活的對象,可以從LINQ實體(即不同的類)單獨設計它們,並使用L2S來填充/創建這些對象。