在FluentNHibernate中的HasMany()关系映射上指定表

时间:2011-04-01 00:22:40

标签: nhibernate fluent-nhibernate nhibernate-mapping

我在FluentNHibernate中有一个映射用于HasMany关系,我想在其上指定一个表来覆盖nHibernate将查找那些我有很多对象的默认表。这有意义吗?

因此,假设我有一个发票表和一个InvoiceItems表,让我说我有一个名为InvoiceItemsTwo的表。

我有一个Invoice类和一个InvoiceItem类,它们的映射非常简单。我想在我的Invoice映射中指定它应该在InvoiceItemsTwo中查找它的项目,而不是默认的InvoiceItems。

所以我对这种关系的映射看起来像这样

HasMany(c => c.InvoiceItems).Cascade.SaveUpdate().Table("InvoiceItemsTwo");

但这不起作用。我一直在运行时从我的网站上收到错误,该错误显示无效对象名称'InvoiceItems'。

为什么忽略了我在关系映射中明确指定表的事实?

我尝试在运行时转储映射,并且正在设置类似这样的

<bag cascade="save-update" table="InvoiceItemsTwo">

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

table属性仅适用于多对多关系,而非一对多关系。

答案 1 :(得分:0)

您无法在映射类中指定其他表。 Fluent NHibernate使用映射在属性列表(InvoiceItems)上的类。 如果yoy想要使用另一个类来映射您的详细信息表,则必须创建一个InvoceItemsTwo类并将其映射到主表类中。

答案 2 :(得分:0)

可以将列表映射为复合元素而不是一对多关系,然后将其映射到另一个表。但它不是一个好主意。考虑到NH需要知道存储内存中对象的位置。因此,可能会将对象存储在错误的表中。

  • 使用复合元素而不是一对多和组件将所有InvoiceItem存储在单独的表中,而不是多对一(但在Fluent中调用)。
  • 或者将所有InvoiceItem存储在同一个表中并使用常规引用。