2011-02-01 56 views
1

我有一種情況,說一個Notebook存儲Pages。起初,我有這樣的結構。流利的nHibernate,自動遞增數字以外的一個鍵

class Notebook 
{ 
// ... 
public virtual IList<Page> Pages 
{ 
    get; 
    set; 
} 
} 

class Page 
{ 
// .. 
public virtual int Number 
{ 
    get; 
    set; 
} 
} 

工作正常。每個頁面都有一個頁碼。我將有能力在我的用戶界面中重新排序頁面,並更新編號。沒問題。後來我發現我可以用一個字典,更簡化它...

class Notebook 
{ 
// ... 
public virtual IDictionary<int, Page> Pages 
{ 
    get; 
    set; 
} 
} 

class Page 
{ 
// .. 
} 

和MAP它像這樣..

public class NotebookMap : ClassMap<Notebook> 
{ 
    public NotebookMap() 
    { 
     // Specify the Entity Primary Key 
     Id(x => x.Id); 

     // one notebook will have a list of pages with page numbers 
     HasMany<int, Page>(x => x.Pages) 
      .DictionaryKey<int>("Number") 
      .DictionaryValue<Page>("Page") 
      .ForeignKey("Notebook") 
      .Schema("Notebook").Table("Pages"); 

     Schema(Schemas.Collections); Table("Notebooks"); 
    } 
} 

好哇,一切是正確的與世界同步。這很好。但我很好奇......

有沒有什麼辦法可以將Number綁定到什麼東西上,以確保每個Notebook自動遞增?現在,我只需在我的Service中使用Notebook.Pages.Count方法處理此問題,當我添加一個新頁面時。但流利的nHibernate看起來很聰明。有沒有什麼方法可以將它直接集成到映射中,以便我隨時添加一個新頁面,它只是獲得計數並確保編號是合適的?

回答

1

我想你真的想保持這種映射。你將混合應用程序邏輯(下一頁應該去哪裏)和模型(我如何存儲下一頁)。此外,如果您將此列自動遞增,您必須以每個表爲基礎執行此操作。除非你爲每本書創建一個新表,否則(AFAIK)只能持續遞增1個鍵(因爲在NHibernate中使用自動增量列的本地生成器是通過數據庫完成的)。

+0

但是,如果我在應用程序邏輯中保留這個,那麼繼續使用這種方法應該沒問題?我不會將它保留在應用程序邏輯中,但是在我的書中,任何可以減少出錯機會的東西都是很好的。正如我的例子所示,我有點擔心我實際上必須使用``而不是``。它只在'Type'是第一個時纔有效 - 這對我來說毫無意義。 – Ciel 2011-02-01 20:12:15