代码之家  ›  专栏  ›  技术社区  ›  Liedman

在hibernate/nhibernate中,将多对多映射为不带联接表

  •  2
  • Liedman  · 技术社区  · 15 年前

    我有两张桌子:

    CalendarEntry
      Id
      Date
      ...
    
    Holiday
      Id
      Date
      ...
    

    在我的 CalendarEntry 同学们,我有这样的财产

    public ISet<Holiday> Holidays { ... }
    

    我想将其与 Holiday 相同的实例 Date 作为 日历条目 . 但是,我想不出怎么做。

    我尝试将其映射为一对多,但一对多自动假定它应该使用 日历条目 Id 列(可能是因为它是唯一保证唯一的属性,必须是一对多的属性)。

    我试过将其映射为多对多,但似乎多对多需要一个单独的联接表,在本例中我不希望这样做。

    我的问题是:有没有可能用NHibernate绘制这个地图,我该怎么做?如果不可能,为什么?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Jon Seigel    15 年前

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


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

        2
  •  1
  •   Jamie Ide    15 年前

    您应该能够使用属性引用来完成这项工作,我相信它在NHibernate 2.1中可用。我发现它在 link text 这里是 jira 添加到NHIBERNATE中。

    我不确定这是否适用于日期列,如果日期字段包含时间数据,您肯定会走运。

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

        3
  •  0
  •   Sam    15 年前

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

    您需要确保nhibernate不会尝试更新集合(可能是 inverse="true" cascade="none" )并且避免在代码中修改它们——我想你可以接受这一点,因为你根本不想要一个表。

    推荐文章