Получить ребенка без первичного ключа NHibernate - PullRequest
2 голосов
/ 21 апреля 2009

Я пытаюсь получить коллекцию объектов в родительский объект с помощью сопоставления.

У меня есть родительский объект "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 получен из представления, которое возвращает оба нужных мне столбца плюс злой указатель. Что бы я ни пытался, NHibernate продолжает выдавать исключение о том, что внешний ключ не совпадает с первичным ключом.

Мне кажется, это самое простое требование: собрать набор вещей с учетом некоторых критериев, почему я так застрял?

Спасибо за вашу помощь, извините за плохой пример кода (подсознательное наблюдение за гольфом в доме родственников).

Ответы [ 2 ]

3 голосов
/ 22 апреля 2009

Ну, я нашел это в конце концов. Родительский объект рисуется из представления, дающего три столбца без ключа. Я могу сопоставить составной ключ с HoleId и PlayerId вместо злого гида, который я обнаружил, когда посмотрел на код. Это замечательно, так как я могу легко сопоставить нужные мне объекты 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>

Я черпал вдохновение из этого поста , пожалуйста, обратите внимание на ответ Стефана, так как я чувствую, что мне повезло, и дизайн мог бы быть лучше, если больше думать о DDD.

Спасибо за вашу помощь.

1 голос
/ 22 апреля 2009

Проблема в следующем: NHibernate лучше всего работает (но не только) для DDD, это означает, что сначала нужно создать классы домена и сделать базу данных наиболее подходящей для модели домена.

У вас есть отношение составного идентификатора к полям не первичного ключа. Так что начинайте молиться, чтобы NHibernate справился с этим. Как составные идентификаторы, так и отношения по неосновным ключам поддерживаются - для устаревших баз данных - и вообще не рекомендуется для DDD.

Я думаю, что сочетание обоих не работает. Посмотрите эту проблему на трекере проблем NHibernates: https://nhibernate.jira.com/browse/NH-1722. Вы можете проголосовать за эту функцию там.

...