Nhibernate - почему он пытается вставить существующую родительскую строку при вставке дочернего - PullRequest
0 голосов
/ 28 августа 2009

Не понимаю, почему NHibernate пытается вставить родительский объект - когда строка уже существует в БД - когда я вставляю дочернюю строку.

Родительское сопоставление:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
<class name="ReportDistribution.Client.ReportMgr.Model.ClientReport, ReportDistribution.Client.ReportMgr.Model" 
     table="ClientReport" 
     lazy="false"
     dynamic-update="true">
<id name="Id" access="property" column="ReportID">
  <generator class="assigned"></generator>
</id>
<property name="MaxAge" access="property" />
<property name="DeleteUnread" access="property" />
<property name="Description" access="property" />
<property name="Name" access="property" />
<bag name="ClientPublications" cascade="all" lazy="false">
  <key column="ReportID" />
  <one-to-many class="ReportDistribution.Client.ReportMgr.Model.ClientPublication, ReportDistribution.Client.ReportMgr.Model" />        
</bag>
</class>  
</hibernate-mapping>

Детское картирование:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
<class name="ReportDistribution.Client.ReportMgr.Model.ClientPublication, ReportDistribution.Client.ReportMgr.Model" 
   table="ClientPublication" 
   lazy="false"
   dynamic-update="true">
<id name="Id" access="property" column="PublicationID">
  <generator class="assigned"></generator>
</id>  
<property name="CreatedOn" access="property" type="DateTime"></property>
<property name="IsMarkedForDeletion" access="property"></property>
<property name="IsDeleted" access="property"></property>
<property name="HasBeenRead" access="property"></property>
<property name="ReceivedOn" access="property" type="DateTime"></property>
<property name="FileExtension" access="property"></property>  
<property name="IsDownloaded" access="property"></property>
<property name="MustRead" access="property"></property>
<many-to-one    
  name="Report"
  class="ReportDistribution.Client.ReportMgr.Model.ClientReport, ReportDistribution.Client.ReportMgr.Model"
  lazy="false"
  column="ReportID">
</many-to-one>
</class>
</hibernate-mapping>

Родительский класс (Report) имеет свойство, которое является коллекцией дочерних классов. Дочерний класс (Publication) имеет свойство, которое является родительским объектом.

Заранее спасибо ....

1 Ответ

0 голосов
/ 28 августа 2009

Мне кажется, что родительский объект больше не подключен к сеансу при сохранении дочернего объекта. HNibernate отслеживает состояние объектов, которые подключены к сеансу, но если объект становится отсоединенным, он теряет способность отслеживать состояние.

Думайте об этом так: если сущность не прошла точный экземпляр ISession, который вы используете в данный момент, то она не знает, что он существует. Следовательно, он обрабатывает все, что никогда не видел, как если бы он был «новым».

Одним из вариантов может быть использование ISession.Load (entity); перезагрузить родителя перед сохранением.

...