Notebook
がPages
というような状況があります。最初は、このような構造になっていました。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ようにそれをマッピングし、すべてが世界で正しかったです。これは素晴らしいです。しかし、私は好奇心が強いです...
Number
をNotebook
ごとに自動インクリメントするようにバインドする方法はありますか?今、私はService
で、新しいページを追加するときにNotebook.Pages.Count
メソッドを使ってこれを処理します。しかし、流暢なnHibernateはかなり賢いようです。新しいページを追加するたびに、カウントを取得して番号が適切であることを確認するように、マッピングに正しく統合できる方法はありますか?
しかし、これをアプリケーションロジックに残しておけば、この方法を進めるのはいいでしょうか?私はアプリケーションロジックの中でそれを維持することを心配していませんが、エラーの可能性を減らすものは私の本では良いと考えられています。私は実際に私の例に示すように ''の代わりに ''を使用しなければならないことに少し気になります。 'Type'が最初のものである場合にのみ動作します。これは私にはほとんど意味がありません。 –
Ciel
自動インクリメント列を使用すると、1つのテーブルに1つの列しか含めることができなくなります。また、データベースは、ページの次のIDが何であるかを気にしたり、知ってはいけません。前にそれを照会する必要があります。あなたがしない場合は、新しいものを挿入することができます(ページにユニーク制約がある場合は、それを挿入しようとしても、ユニーク制約に違反した場合は失敗することさえできます)。ページを順不同に挿入できますか?または、ページ1を2ページ持っている必要がありますか? – Nicholas
注文はデータには関係なく、ユーザーインターフェイスの再調整のみです。それは、すべての重要なノートブックのための唯一の3として、ページ1,194、および108501410844である可能性があります。 – Ciel