2011-02-01 12 views
1

NotebookPagesというような状況があります。最初は、このような構造になっていました。Fluent nHibernate、キー以外の数値の自動インクリメント

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

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

これは問題なく機能しました。各ページにはページ番号があります。 UIのページを並べ替えて番号を更新する機能があります。問題ない。その後、私は

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

class Page 
{ 
// .. 
} 

...私は辞書を使用して、より多くのそれを簡素化することができ発見し..だから

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"); 
    } 
} 

Huzzahようにそれをマッピングし、すべてが世界で正しかったです。これは素晴らしいです。しかし、私は好奇心が強いです...

NumberNotebookごとに自動インクリメントするようにバインドする方法はありますか?今、私はServiceで、新しいページを追加するときにNotebook.Pages.Countメソッドを使ってこれを処理します。しかし、流暢なnHibernateはかなり賢いようです。新しいページを追加するたびに、カウントを取得して番号が適切であることを確認するように、マッピングに正しく統合できる方法はありますか?

答えて

1

私は本当にこれをマッピングから外しておきたいと思います。アプリケーションロジック(次のページをどこに置くか)をモデルと混合します(次のページをどのように保存するのか)。また、この列を自動インクリメントにすると、テーブル単位で行う必要があります。各本のために新しいテーブルを作成していない限り、AFAIKは1つの一貫して増分するキーを持つことができます(NHibernateの自動増分カラムを使用するネイティブジェネレータはデータベース経由で行われるため)。

+0

しかし、これをアプリケーションロジックに残しておけば、この方法を進めるのはいいでしょうか?私はアプリケーションロジックの中でそれを維持することを心配していませんが、エラーの可能性を減らすものは私の本では良いと考えられています。私は実際に私の例に示すように ''の代わりに ''を使用しなければならないことに少し気になります。 'Type'が最初のものである場合にのみ動作します。これは私にはほとんど意味がありません。 – Ciel

+0

自動インクリメント列を使用すると、1つのテーブルに1つの列しか含めることができなくなります。また、データベースは、ページの次のIDが何であるかを気にしたり、知ってはいけません。前にそれを照会する必要があります。あなたがしない場合は、新しいものを挿入することができます(ページにユニーク制約がある場合は、それを挿入しようとしても、ユニーク制約に違反した場合は失敗することさえできます)。ページを順不同に挿入できますか?または、ページ1を2ページ持っている必要がありますか? – Nicholas

+0

注文はデータには関係なく、ユーザーインターフェイスの再調整のみです。それは、すべての重要なノートブックのための唯一の3として、ページ1,194、および108501410844である可能性があります。 – Ciel

関連する問題