NHibernate: отображение двунаправленной связи «один ко многим» с семантикой IList - PullRequest
5 голосов
/ 11 мая 2011

Вот соответствующие штуки. Это родительский объект:

public class Article
{
    public virtual IList<ArticleRevision> Revisions { get; set; }
}

<list name="Revisions" cascade="all" inverse="true" table="ArticleRevision">
  <cache usage="read-write" />

  <key column="ArticleID" not-null="true" />
  <index column="Number" type="int32" />
  <one-to-many class="ArticleRevision" />
</list>

Это ребенок:

public class ArticleRevision
{
    public virtual Article Article { get; set; }
}

<many-to-one name="Article" column="ArticleID" not-null="true" />

Теперь я создаю экземпляр Article, добавляю одну коллекцию ArticleRevision к Article.Revisions, задаю ArticleRevision.Article для ссылки на экземпляр Article и помещаю его в базу данных:

INSERT 
INTO
    ArticleRevision
    (Content, Keywords, CreatedAt, SiteID, ArticleID, CreatedByUserID, ID) 
VALUES
    (@p0, @p1, @p2, @p3, @p4, @p5, @p6);

Нет Number столбец вставляется.

Как правильно сопоставить двунаправленную коллекцию «один ко многим» с семантикой списка в NHibernate?

Ответы [ 2 ]

6 голосов
/ 12 мая 2011

Из документации NHibernate :

Обратите внимание, что NHibernate не поддерживает двунаправленные связи один-ко-многим с индексированной коллекцией (списком, картой или массивом) в качестве«много» заканчивается, вы должны использовать набор или сумку карт.

1 голос
/ 07 июня 2016

Насколько я знаю, все платформы 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. Как следствие, вы получите нарушение ограничения в противном случае.

...