2009-06-22 2 views
0

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

  • Один клиент для многого Intakes
  • Один Впускных на многие 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 создает клиент, то впускной и затем 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 ничего не говорит.

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

ответ

0

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

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

в

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

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

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

Смежные вопросы