代码之家  ›  专栏  ›  技术社区  ›  cdmckay

NHibernate尝试创建同一实体两次

  •  0
  • cdmckay  · 技术社区  · 15 年前

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

    • 一人多案管理
    • 一案多干预
    • 客户、招生、案例管理是每个表的单一类
    • 干预是每个表的类层次结构。

    目前,如果我这样做:

    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在数据库中创建一个客户机,然后创建一个收信人,然后创建一个案例管理(所有这些都适当链接)。

    但是,如果执行以下操作:

    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 ... (*)
    

    其中星号线是相同的。我不知道为什么使用继承会导致这种情况。

    这是我的进气类的映射(与客户机和案例管理几乎相同)。

    <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>
    

    以下是干预类层次结构的映射:

    <?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 回复  |  直到 15 年前
        1
  •  0
  •   cdmckay    15 年前

    我解决了这个问题。这是因为我使用InterferenceType列作为鉴别器和属性。我发现如果我改变了

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

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

    问题消失了。