Сохранение созданных вручную объектов с помощью NHibernate - PullRequest
0 голосов
/ 12 августа 2010

Я пытаюсь использовать NHibernate, чтобы сохранить объект, который был полностью создан вручную.Мои сопоставления на месте, и в настоящее время у меня нет данных в базе данных.Каждый раз, когда я вызываю Save () или SaveOrUpdate (), NHibernate делает оператор выбора для того, что я пытаюсь сохранить.Затем это дает мне исключение: «другой объект с таким же значением идентификатора уже был связан с сеансом».Кто-нибудь знает, как я могу сказать NHibernate, чтобы сохранить мой экземпляр объекта вручную, не думая, что другой объект уже был загружен?

Дополнительная информация:

У меня есть первичное сопоставление с коллекцией один ко многим.Исключение говорит мне, что «загружен другой объект с тем же идентификатором» в коллекции, а не в родительском объекте.Я не знаю, дает ли это какую-либо полезную информацию.Отображения следующие:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Program.Application.Models" assembly="Company.Application.Models">
  <class name="ProductVersion" table="ClientVersion" lazy="false">
    <composite-id>
      <key-property name="PracticeName">
        <column name="practiceName" not-null="true" />
      </key-property>
      <key-property name="Address">
        <column name="address" not-null="true" />
      </key-property>
      <key-property name="City">
        <column name="city" not-null="true" />
      </key-property>
      <key-property name="State">
        <column name="state" not-null="true" />
      </key-property>
      <key-property name="Zip">
        <column name="zip" not-null="true" />
      </key-property>
    </composite-id>
    <property name="LegalName" column="legalName" />
    <property name="Version" column="version" />
    <bag name="ProductsLicensesDetail" inverse="true" lazy="false" >
      <key>
        <column name="practiceName" />
        <column name="address" />
        <column name="city" />
        <column name="state" />
        <column name="zip" />
      </key>
      <one-to-many class="ProductLicenseDetail" />
    </bag>
  </class>
</hibernate-mapping>

и

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Program.Application.Models" assembly="Program.Application.Models">
  <class name="ProductLicenseDetail" table="ClientProductLicense">
    <id name="ProductCode" column="productCode">
      <generator class="assigned" />
    </id>
    <property name="TotalEnterpriseLicenses" column="totalEnterpriseLicenses" />
    <property name="EnterpriseLicensesUsed" column="enterpriseLicensesUsed" />
    <property name="TotalPracticeLicenses" column="totalPracticeLicenses" />
    <property name="PracticeLicensesUsed" column="practiceLicensesUsed" />
    <property name="TotalProviderLicenses" column="totalProviderLicenses" />
    <property name="ProviderLicensesUsed" column="providerLicensesUsed" />
    <property name="TotalUserLicenses" column="totalUserLicenses" />
    <property name="UserLicensesUsed" column="userLicensesUsed" />
    <property name="LicenseKey" column="licenseKey" />
    <property name="LicenseActivationDate" column="licenseActivationDate" />
    <property name="LicenseExpirationDate" column="licenseExpirationDate" />

    <many-to-one name="ProductVersion" class="ProductVersion" cascade="none">
      <column name="practiceName" />
      <column name="address" />
      <column name="city" />
      <column name="state" />
      <column name="zip" />
    </many-to-one>
  </class>
</hibernate-mapping>

NHibernate сообщает мне, что «другой объект с таким же значением идентификатора уже был связан с сеансом» для ключа ProductCodeвторого отображения.Любое понимание будет высоко ценится.Спасибо.

Ответы [ 2 ]

1 голос
/ 12 августа 2010

Полагаю, вам нужно будет добавить поле версии в класс составного ключа и отображение;подробности см. в этой статье .

0 голосов
/ 12 августа 2010

Вы пробовали

session.SaveOrUpdateCopy(entity);
session.Flush();

...