2009-02-16 3 views
15

У меня есть классы сообщений и комментариев, и у них есть отношения от одного до многих, где Post имеет список комментариев. Как я могу сопоставить это как однонаправленное отношение с Fluent NHibernate, так как комментарий не должен знать его родительскую Почту? В настоящее время, это мое отображение для комментариев:Fluent NHibernate для одного однонаправленного отображения

Id(x => x.Id); 
Map(x => x.Body); 
References(x => x.User); 

и сообщение:

Id(x => x.Id); 
Map(x => x.Title); 
HasMany(x => x.Comments) 
    .Inverse() 
    .WithKeyColumn("PostId") 
    .Cascade.AllDeleteOrphan(); 

Это не работает, потому что, когда я пытаюсь сохранить экземпляр сообщения с недавно добавленным комментарий, внешний ключ на комментарий (PostId) остается NULL. И, конечно, комментарий не может быть сохранен с помощью NULL PostId. Я попытался удалить предложение .Inverse(), но это тоже не сработает.

+3

Иди в себя. Очень раздражающее ограничение ИМО. –

+1

Возможно с NH3.1 и выше, см. Мой ответ на другой простой вопрос. Http://stackoverflow.com/questions/4466153/nhibernate-configuration-for-uni-directional-one-to-many-relation/7601312# 7601312 – hazzik

ответ

22

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

Вы либо необходимость:

  1. Удалите не-нулевое ограничение иInverse позвонить
  2. Держите ограничение и карту на другую сторону отношений (делая это двунаправленная связь и позволяет Inverse правильно работать)

Это описано в NHibernate documentation for one-to-many's см Очень Важное примечание в конце.

+0

Неиспользованно ссылка, fyi. –

+1

Нет, это не так. Возможно, сайт временно отключен, но ссылка определенно остается действительной. –

+1

Спасибо за ответ. Жаль, что NH работает таким образом, я не вижу причин, почему это нужно. –