NHibernate пытается создать одну и ту же сущность дважды - PullRequest
0 голосов
/ 23 июня 2009

В настоящее время у меня есть база данных со следующими ассоциациями:

  • Один клиент на много приемов
  • Один вход во многие CaseManagements
  • Один CaseManagement для многих вмешательств
  • Client, Intake, CaseManagement - это отдельные классы на таблицу
  • Вмешательство - это иерархия классов на таблицу.

В настоящее время, если я сделаю что-то вроде этого:

var client = new Client();
clientRepo.Add(client);

var intake = new Intake();
client.Add(intake);

var caseMan = new CaseManagement();
intake.Add(caseMan);

clientRepo.Update(client);

Все работает нормально, и NHibernate создает в базе данных клиента, затем Intake, а затем CaseManagement (все соответственно связаны)

Однако, если выполните следующее:

var client = new Client();
clientRepo.Add(client);

var intake = new Intake();
client.Add(intake);

var caseMan = new CaseManagement();
intake.Add(caseMan);

var intervention = new SubIntervention();
caseMan.Add(intervention);

clientRepo.Update(client);

Он облажался и запускает следующий SQL:

INSERT INTO TblClient ... (*)
INSERT INTO TblIntake ...
INSERT INTO TblCaseManagement ...
INSERT INTO TblClient ... (*)

Где отмеченные звездочкой строки идентичны. Я понятия не имею, почему использование наследования вызывает это.

Вот мое сопоставление для моего класса Intake (которое практически совпадает с Client и CaseManagement).

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="WebTracker4"
                   namespace="WebTracker4.Domain">

<!-- Class Mapping -->
<class name="Intake" table="TblIntake">

<!-- Id -->
<id name="Id" column="IntakeId">
  <generator class="sequence">
    <param name="sequence">IntakeSequence</param>
  </generator>
</id>

<!-- TCN -->
<version name="Tcn" column="IntakeTcn" type="Int64" />

<!-- Client -->    
<many-to-one name="Client" column="ClientId" class="Client" />

<!-- Case Management -->    
<bag name="CaseManagements" inverse="true" cascade="all" table="TblCaseManage" order-by="CaseManageId desc">
  <key column="IntakeId" />
  <one-to-many class="CaseManagement" />
</bag>

<!-- Properties -->
...

</class>
</hibernate-mapping>

Вот мое отображение иерархии классов Intervention:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               assembly="WebTracker4"
               namespace="WebTracker4.Domain.Interventions">

<!-- Class Mapping -->
<class name="Intervention" table="TblIntervention" abstract="true">

<!-- Id -->
<id name="Id" column="InterventionId">
  <generator class="sequence">
    <param name="sequence">InterventionSequence</param>
  </generator>
</id>

<!-- Discriminator -->
<!-- This is used so that we can have Intervention subclasses. -->
<discriminator column="InterventionType" type="String" />

<!-- TCN -->
<version name="Tcn" column="InterventionTcn" type="Int64" />  

<!-- Case Management -->
<many-to-one name="CaseManagement" column="CaseManageId" class="WebTracker4.Domain.CaseManagement, WebTracker4" />

<!-- Properties -->    
....

<!-- Assessment Subclass -->
<subclass name="SubIntervention" discriminator-value="Sub">
  ...
</subclass>

</class>

Чего мне не хватает, что заставляет его пытаться повторно добавить клиентскую сущность? Также следует отметить, что если я напортачу имена столбцов в подклассе, NHibernate ничего не скажет.

Это сводит меня с ума, пожалуйста, помогите:)

1 Ответ

0 голосов
/ 23 июня 2009

Я разобрался в проблеме. Это потому, что я использовал столбец InterventionType как дискриминатор и свойство. Я обнаружил, что если я изменил

<discriminator column="InterventionType" type="String" />

в

<discriminator column="InterventionType" type="String" insert="false" />

проблема ушла.

Я думаю, это потому, что вы в основном говорите NHibernate не управлять колонкой дискриминатора.

...