获取没有主键NHibernate的子进程

时间:2009-04-21 16:20:21

标签: nhibernate nhibernate-mapping nhibernate-collections

我试图通过映射将对象集合到父对象中。

我有一个父对象“ScoreCard”,其主键是一个guid(Id)和一个子“Score”对象,其主键是一个guid(Id)。我想基于两个对象具有的两个字段为父级选择子对象但是我无法使其工作,这是映射

<bag name="ScoreCard">
  <key>
    <column name="HoleId"/>
    <column name="PlayerId"/>
  </key>
  <one-to-many class="Score" not-found="ignore"/>
</bag>

我没有设计数据库,但ScoreCard对象来自一个视图,它返回我需要的列和邪恶的guid。无论我尝试过什么,NHibernate都不断抛出与外键不同的异常。

在我看来这是最简单的要求,根据一些标准得到一些东西,为什么我这么卡住?

感谢您的帮助,对于糟糕的示例代码(在亲戚家里观看潜意识高尔夫球)感到抱歉。

2 个答案:

答案 0 :(得分:3)

好吧,我最终找到了它。父对象是从一个视图中提取的,该视图给出了三列而没有键。我可以将复合键映射到HoleId和PlayerId,而不是我在查看代码时找到的邪恶guid。这很棒,因为我可以轻松地映射我需要的Score对象,然后使用NHibernateUtil.Initialize延迟加载它们。

我的映射xml需要看起来像这样

<class name="ParentObject">
    <composite-id>
      <key-property name="HoleId" column="HoleId" />
      <key-property name="PlayerId" column="PlayerId" />      
    </composite-id>
    <property name="EvilGuid" column="Id" />
    <bag name="ScoreCard">
      <key>
        <column name="HoleId"/>
       <column name="PlayerId"/>
      </key>  
      <one-to-many class="Score" not-found="ignore"/>
    </bag>
</class>

我从this post得到了灵感,请注意Stefan的回答,因为我觉得我在这里度过了一个幸运的时光,并且可以通过更多地考虑DDD来改善设计。

感谢您的帮助。

答案 1 :(得分:1)

问题在于:NHibernate最适合(但不仅仅)DDD,这意味着首先创建域类并使数据库最适合域模型。

您与非主键字段具有复合ID关系。所以开始祈祷NHibernate可以应付这一点。对于遗留数据库,支持复合ID和非主键的关系,并且通常不鼓励使用DDD。

我认为两者的结合不起作用。在NHibernates问题跟踪器上查看此问题: https://nhibernate.jira.com/browse/NH-1722。您可以在那里投票支持该功能。