我有一种情况,例如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看起来很聪明。有没有什么方法可以将它直接集成到映射中,这样每当我添加一个新页面时,它只是得到计数并确保数字是合适的?
答案 0 :(得分:1)
我认为你真的希望将其排除在映射之外。你将混合应用程序逻辑(下一页应该去哪里)和模型(如何存储下一页)。此外,如果您使此列自动增加,则必须基于每个表执行此操作。除非您为每本书创建一个新表,否则您(AFAIK)只能拥有1个一致递增的键(因为NHibernate中使用自动增量列的本机生成器是通过数据库完成的。)