NHibernate не вставляет родителя в БД - PullRequest
0 голосов
/ 15 сентября 2009

Когда я сохраняю новый отчет, NHibernate вставляет отчет, игнорирует публикацию и пытается вставить пользовательскую публикацию. Однако SQL тогда жалуется на нарушение ограничения FK. Похоже, NHibernate не думает, что публикация является новой, хотя строка не существует в БД.

Думайте об отношениях сущности как: Отчет может иметь много публикаций (публикации принадлежат отчету) Публикация может иметь много пользовательских публикаций (пользовательские публикации принадлежат публикации)

Есть идеи, что я сделал не так? Заранее спасибо.

Вот сопоставления:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
<class name="Model.Report, Model" table="Report" lazy="true">
  <id name="Id" access="property" column="ReportID">
    <generator class="assigned"></generator>
  </id>    
  <property name="DeleteUnread" access="property" />
  <property name="Description" access="property" />
  <property name="Name" access="property" />    
  <bag name="Publications" access="property" lazy="true" cascade="all-delete-orphan">
    <key column="ReportID"/>
    <one-to-many class="Model.Publication, Model"/>        
  </bag>
</class>  
</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
  <class name="Model.Publication, Model" table="Publication" lazy="true">
    <id name="Id" access="property" column="PublicationID">    
      <generator class="assigned"></generator>
    </id>  
    <property name="CreatedOn" access="property" />
    <property name="FileExtension" access="property" /> 
    <property name="IsDownloaded" access="property" />
    <property name="ToBeDownloaded" access="property" />
    <property name="Name" access="property"/>  
    <bag name="UserPublications" access="property" lazy="true" cascade="all-delete-orphan">    
      <key column="PublicationID"></key>
      <one-to-many class="Model.UserPublication, Model" />
    </bag>
    <many-to-one name="Report" class="Model.Report, Model" lazy="false" column="ReportID" not-null="true" cascade="none">
    </many-to-one>
  </class>
</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
  <class name="Model.UserPublication, Model" table="UserPublication" lazy="true">
    <id name="Id" access="property" column="UserPublicationID">
      <generator class="native"></generator>
    </id>
    <property name="IsFlaggedForDeletion" access="property" column="IsFlaggedForDeletion" />
    <property name="HasBeenRead" access="property" column="HasBeenRead" />
    <property name="DateReceived" access="property" column="DateReceived" />
    <property name="MustRead" access="property" column="MustRead" />
    <property name="ShowToolbar" access="property" column="ShowToolbar" />
    <property name="MaxAge" access="property" column="MaxAge" />
    <property name="FeedId" access="property" column="FeedId" />
    <property name="CanEdit" access="property" column="CanEdit" />    
    <many-to-one name="User" access="property" column="ClientUserID" class="Model.ClientUser, Model" not-null="true" cascade="none">      
    </many-to-one>
    <many-to-one name="Publication" access="property" class="Model.Publication, Model" column="PublicationID" not-null="true" cascade="none">      
    </many-to-one>
</class>

Ответы [ 3 ]

0 голосов
/ 16 сентября 2009

Сумка UserPublications в классе Publication содержит неверный ключевой элемент. Должно быть:

<key column="PublicationID"/>
0 голосов
/ 17 сентября 2009

Это работает. Я установил атрибут unsaved-value в значение «any».

Я не думаю, что будут какие-то рецидивы.

<id name="Id" access="property" column="PublicationID" unsaved-value="any">    
  <generator class="assigned"></generator>
</id>
0 голосов
/ 16 сентября 2009

Мне кажется, проблема в том, что id публикаций - это назначенный идентификатор, поэтому NHibernate не может распознать, когда он должен вставить публикацию. Когда вы очищаете сеанс, он сначала вставляет все вставленные объекты, затем обновляет все обновленные объекты, а затем удаляет все удаленные объекты. Поэтому я думаю, что это произойдет здесь: Вы сохраняете отчет, в котором есть публикации, в которых есть userpublications. Поскольку идентификатор публикации назначен, NHibernate предполагает, что он должен быть обновлен, и игнорирует его, но идентификатор UserPublication является собственным, а NHibernates знает, когда его следует вставить, и пытается вставить его, таким образом, происходит нарушение FK. Чтобы решить эту проблему, вы можете добавить свойство версии в публикацию, чтобы NHibernate мог вставить его на основе значения версии.

...