2011-10-29 35 views
1

我想學習NHibernate,我偶然發現了一個組合的數據庫設計/「學習NHibernate如何工作」的問題。避免與NHibernate的對象身份

對我而言,我試圖設計一個帶有行和列的簡單表格,其中每行都有一個「描述」,然後有一個「列值」列表(各種列),其中包含的數據爲以及排序信息。在代碼中,它會是這個樣子:

public class Row 
{ 
    public virtual int ID { get; set; } 
    public virtual string Description { get; set; } 
    public virtual ICollection<Column> Columns { get; set; } 
} 

public class Column 
{ 
    public virtual Row ParentRow { get; set; } 
    public virtual int SortID { get; set; } 
    public virtual string Value { get; set; } 
} 

我的最終目標是要建立一個數據庫架構,這將是...

  • 兩個表,「行」和「列」
  • 行有兩列:ID和說明。
  • 列有三列:ParentID,SortID和Value。

由於列只能屬於一行,理想情況下每個列在每個ParentID中都有一個唯一的排序ID,所以Column表的主鍵可以是ParentID和SortID,而不是第四個「ID 「專欄。

但是,NHibernate每時每刻都在與我搏鬥。它堅持我必須有一個列字段的ID。我想我有幾個問題:

  1. 我的「模式目標」本身是否存在嚴重缺陷?對於每個Column來說,它是否有更好的設計來擁有自己的ID?如果是這樣,爲什麼?
  2. 無論我正在尋找的模式是否是一個好設計,NHibernate中都可以完成這項工作嗎?到目前爲止,我已經成功地映射了「Row」類,但是如果沒有NHibernate,我不能映射「Column」類,因爲我不得不爲它提供一個ID。 (對於它的價值,我使用Fluent NHibernate)。我如何繞過這個?

回答

1

ORM一般可以映射主鍵和複合主鍵標識符。從這兩個選項中,你應該選擇最適合你的用例。

要了解如何映射覆合主鍵標識符,請閱讀Nhibernate文檔中的composite-id部分。

從經驗中說,我發現非複合主鍵標識符是您的ORMs最好的朋友。在許多情況下,它使生活變得更容易,例如基於應用程序的ID生成,批處理等。在類似於「列」表的表格中,我更喜歡有一個合成主鍵標識符(Surrogate key)。但是,這又取決於你的需求,YMMV。

0

in OOP建模有兩種不同的類型。引用類型和值類型。它們之間的區別在於,對於引用類型,您關心的是,它們是,它們是由某個標識符標識的,對於您關心的值類型它們是什麼

一個簡單的例子會在。淨世界是

DateTime d1 = new DateTime(2012,12,21);

DateTime d2 = new DateTime(2012,12,21);

現在我們真的關心這兩個日期時間指向不同的內存實例(和它們指向左右)

沒有,但我們只關心它們是什麼,因此他們是平等的。

您應該首先確定您的實體是值類型還是引用類型。如果它是一個引用類型,你應該遵守上面的定義並給出一些標識符。如果你不能給一個標識符,那麼它應該是一個值類型。在這種情況下,你不關心它是哪一個,而是它是什麼。對於這種情況,nhibernate爲您提供組件。對於可能存在於同一個表中或單獨存在的組件,無需定義ID。但是nhibernate不會將它們視爲一個實體。