【问题标题】:NHibernate mapping collection without foreign key没有外键的 NHibernate 映射集合
【发布时间】:2018-03-04 22:28:34
【问题描述】:

我有一个名为 WorkingDays 的课程,该课程需要一组日期,即银行假日的日期。在我们的数据库中,我们有一个包含这些日期的表 - 我希望 nhibernate 获取所有这些日期并填充 bankHolidays 集合。

但问题是,我没有代表数据库中链接的表 - 当所有 WorkingDays impls 都具有完全相同的银行假日日期列表时,这似乎没有必要。

那么如何在不需要添加外键的情况下映射它呢?希望下面的代码能更好的说明:

public class WorkingDays : Interval
{
   public ICollection<DateTime> BankHolidays
   {
       get;
       private set;
   }
}

【问题讨论】:

    标签: nhibernate nhibernate-mapping


    【解决方案1】:

    您是否有理由需要它作为实体本身的集合?为什么没有一个单独的存储库/DAO 负责访问这个集合?如果数据是相当静态的,您可能也可以通过在此上使用二级缓存来获得相当多的收益。

    【讨论】:

    • 我不确定这将如何工作,除非我加载 DateTimes 并将它们传递给 WorkingDays - 但是因为它继承自 Interval,所以没有办法做到这一点。
    • 我想这取决于您的使用情况;如果您需要在下游层中使用此集合,您可以始终将此属性分配为映射操作等的一部分。
    • 再想一想...如何填充实体上的集合的自定义 IPostLoadEventListener?我从来没有尝试过这样的事情,但我不明白为什么它不起作用。
    • 是的,我想知道如何使用侦听器来实现这一点 - 但希望有一个映射文件解决方案。感谢您的输入
    【解决方案2】:

    如果您只需要一个只读集合,您可以尝试以下方法:

    <property name="BankHolidays" type="DateTime[]" formula="(SELECT Date FROM BankHolidays)" update="false" insert="false" />
    

    【讨论】:

    • 这听起来像是答案!谢谢 - 我会在星期一试试
    • 不幸的是它没有用。当按照建议在查询中使用 select 语句时,只会返回找到的第一个 DateTime 而不是全部
    • 太糟糕了,如果成功了,我实际上是要重构一些代码的;我猜基于公式的属性只支持标量值。
    • 抱歉带你上花园小路。您的要求似乎很简单,以至于很难相信 NH 没有简单的映射。您可以尝试在这里提问:groups.google.com/group/nhusers
    【解决方案3】:

    我有一个similar question,并认为我将来会帮助其他人。

    我认为您不能强制 NHibernate 映射与数据库中的父级没有某种关系的子级。毕竟它是一个对象关系映射器

    解决方案是通过数据库来暗示关系。创建一个将WorkingDays 与BankHolidays 链接的视图。然后将 HasMany(x => x.BankHolidays) 添加到您的 WorkingDays 映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2014-04-19
      • 2011-08-08
      • 1970-01-01
      • 2013-03-26
      • 2017-06-28
      相关资源
      最近更新 更多