Насколько я знаю, все платформы ORM утверждают, что, когда у вас двунаправленные отношения, вы должны определить одну сторону, на которую будет опираться ваша ORM при обновлении состояния ваших двунаправленных отношений. В противном случае вы можете получить побочные эффекты, такие как
- Несогласованное отображение
- Нарушение ограничений
- Среди прочего
В вашем случае столбец ArticleID может управляться обоими сторонами отношения. Из-за этого вы должны пометить одну сторону как inverse = "true" , которая должна быть размещена на стороне многих, когда у вас есть отношение @OneToMany.
Однако вы можете добиться того же поведения, отключив свойство ArticleRevision.Article, установив его отображение как
<many-to-one name="Article" column="ArticleID" insert="false" update="false" />
Используя insert = "false" update = "false" , вы говорите: NHibernate, меня не волнует, в результате чего, NHibenate вы просто игнорируете. Теперь отбросьте inverse = "false" в свойстве Article.Revisions, и вы получите свой ответ.
UPDATE:
Удалить not-null = "true" из ключевого столбца, поскольку он обновляется сразу после ArticleRevision. Как следствие, вы получите нарушение ограничения в противном случае.