NHibernate tenta di creare la stessa entità due volte
-
06-07-2019 - |
Domanda
Attualmente ho un database con le seguenti associazioni:
- Un cliente a molte prese
- Un unico apporto a molti CaseManagements
- Un caso di gestione di molti interventi
- Client, Intake, CaseManagement sono singole classi per tabella
- L'intervento è una gerarchia di classi per tabella.
Attualmente, se faccio qualcosa del genere:
var client = new Client();
clientRepo.Add(client);
var intake = new Intake();
client.Add(intake);
var caseMan = new CaseManagement();
intake.Add(caseMan);
clientRepo.Update(client);
Tutto funziona bene e NHibernate crea un client, quindi un apporto e quindi un CaseManagement nel database (tutti opportunamente collegati).
Tuttavia, se si procede come segue:
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);
Ha rovinato ed esegue il seguente SQL:
INSERT INTO TblClient ... (*)
INSERT INTO TblIntake ...
INSERT INTO TblCaseManagement ...
INSERT INTO TblClient ... (*)
Dove le linee speciali sono identiche. Non ho idea del perché l'uso dell'ereditarietà stia causando questo.
Ecco la mia mappatura per la mia classe Intake (che è praticamente la stessa di Client e 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>
Ecco la mia mappatura per la gerarchia di classi di intervento:
<?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>
Cosa mi manca che sta provando ad aggiungere nuovamente l'entità Cliente? Ciò che può anche essere degno di nota è che se rovino i nomi delle colonne nella sottoclasse, NHibernate non dice nulla.
Questo mi sta facendo impazzire, per favore aiutatemi :)
Soluzione
Ho capito il problema. Era perché stavo usando la colonna InterventionType sia come discriminatore che come proprietà. Ho scoperto che se avessi cambiato
<discriminator column="InterventionType" type="String" />
in
<discriminator column="InterventionType" type="String" insert="false" />
il problema è scomparso.
Penso che sia perché in pratica stai dicendo a NHibernate di non gestire la colonna dei discriminatori.