在Hibernate / NHibernate中没有连接表的情况下映射多对多

时间:2010-01-11 16:32:07

标签: .net nhibernate orm many-to-many one-to-many

我有两张桌子:

CalendarEntry
  Id
  Date
  ...

Holiday
  Id
  Date
  ...

在我的CalendarEntry课程中,我有一个像这样的属性

public ISet<Holiday> Holidays { ... }

我希望将其与Holiday上与Date相同的CalendarEntry个实例关联起来。但是,我无法想出如何做到这一点。

我已尝试将其映射为一对多,但一对多会自动假设它应使用CalendarEntry的{​​{1}}列执行连接(可能因为它是唯一的保证是唯一的财产,必须是一对多的财产。

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

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

3 个答案:

答案 0 :(得分:1)

我认为您需要做的是设置查询以获取Holiday条目。我不确定这可以使用映射来完成。


我的原始答案的其他信息,可能不适用:您可以在NHibernate中拥有多对多关系,而无需为连接表条目创建单独的实体类,但基础数据仍然需要存在于数据库中。

答案 1 :(得分:1)

你应该能够使用property-ref来做到这一点,我相信NHibernate 2.1中提供了这个属性。我在link text找到了它,而jira是将它添加到NHibernate中。

我不确定这会在日期列上有效,如果您的日期字段包含时间数据,那么您肯定会运气不好。

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

答案 2 :(得分:0)

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

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