2010-01-11 145 views
2

我有两个表:映射许多一对多没有休眠/ NHibernate的连接表

CalendarEntry 
    Id 
    Date 
    ... 

Holiday 
    Id 
    Date 
    ... 

在我CalendarEntry类,我有这样的

public ISet<Holiday> Holidays { ... } 

,我想要的属性关联到与CalendarEntry相同的Date上发生的Holiday实例。但是,我无法想出如何做到这一点。

我试过将它映射为一对多,但一对多自动假定它应该使用CalendarEntryId列执行连接(可能是因为它是唯一保证是唯一的属性,它必须是一对多的)。

我试图将它映射为多对多,但似乎多对多需要一个单独的连接表,我不想在这种情况下。

我的问题是:有可能在NHibernate中映射这个,我应该怎么做?如果不可能,为什么?

+0

你可以发布你试图使用的映射吗? – 2010-01-11 16:35:12

+0

我使用NHibernate.Mapping.Attributes,所以我没有HBM文件,但我会尝试发布我明天使用的映射。 – Liedman 2010-01-11 16:47:05

回答

1

我想你需要做的是设置一个查询来获取假期条目。我不确定这可以使用映射完成。


从我原来的答复,其他信息可能不适用:您可以在NHibernate的许多一对多的关系,而无需为连接表项创建一个独立的实体类,但潜在的数据仍然需要存在于数据库中的某处。

+0

我不愿意使用连接表部分来自抵制修改数据库模式,但主要来自信息已存在的事实 - CalendarEntry和Holiday *中的日期列是*实体之间的关联和新连接表似乎是多余的。 – Liedman 2010-01-11 16:46:18

+1

是啊...这是一个非常松散的耦合,但是,Hibernate希望它很强大(使用ID)。我现在将其设置为查询。 – 2010-01-11 16:49:17

1

你应该可以使用一个property-ref来做到这一点,我相信它可以在NHibernate 2.1中使用。我发现它在link text和这里的jira将它添加到NHibernate。

我不确定这是否适用于日期栏,如果您的日期栏位包含时间数据,那您绝对不走运。

您始终可以将关系留出模型,并通过存储库方法(即GetHolidaysForDate)访问集合。这对我来说会更有意义,因为假期与日历条目和文化特定不同。除非你使用非美国的含义等同于“休假”。

0

您可以创建一个包含CalendarEntryHoliday的相应ID的数据库视图(或派生表查询),然后使用视图映射多对多关系 - 这在技术上避免了有连接表,同时允许NHibernate以它想要的方式工作。

你会想确保NHibernate不会尝试更新集合(可能是inverse="true"cascade="none"的某种组合),并避免在代码中修改它们 - 我认为你没有问题,因为你没有想要一张桌子。

+0

这需要数据库连接CalendarEntry和Holiday两次,一次用于视图,一次用于获取实际数据。此外,它还为查询优化器提供了更多的余地:在使用oracle连接两行时,使用与property-refs映射时使用的嵌套循环连接替换为视图的连接,该连接使用哈希连接和全表扫描... – meriton 2010-03-10 21:59:16

+0

如果您特别担心读取性能,可以使用物化/索引视图,但考虑到问题域可能最多有这些表中的几千行。 如果property-ref是一个可行的解决方案,它可能是最好的选择,但我之前一直在努力,这是一个很好的解决方法。 – Sam 2010-03-11 01:25:33