流畅的nHibernate,自动递增除键之外的数字

时间:2011-02-01 19:56:27

标签: c# fluent-nhibernate

我有一种情况,例如Notebook存储Pages。起初,我的结构是这样的。

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看起来很聪明。有没有什么方法可以将它直接集成到映射中,这样每当我添加一个新页面时,它只是得到计数并确保数字是合适的?

1 个答案:

答案 0 :(得分:1)

我认为你真的希望将其排除在映射之外。你将混合应用程序逻辑(下一页应该去哪里)和模型(如何存储下一页)。此外,如果您使此列自动增加,则必须基于每个表执行此操作。除非您为每本书创建一个新表,否则您(AFAIK)只能拥有1个一致递增的键(因为NHibernate中使用自动增量列的本机生成器是通过数据库完成的。)