NHibernate尝试两次创建相同的实体

时间:2009-06-22 20:40:07

标签: c# .net nhibernate inheritance nhibernate-mapping

目前我的数据库具有以下关联:

  • 一个客户到多个入学者
  • 一次进入多个案件管理
  • 对多次干预的一个案例管理
  • 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 :(得分:0)

我弄明白了这个问题。这是因为我使用InterventionType列作为鉴别器和属性。我发现如果我改变了

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

<discriminator column="InterventionType" type="String" insert="false" />
问题消失了。

我认为这是因为你基本上告诉NHibernate不要管理鉴别器列。