【发布时间】:2009-06-22 20:40:07
【问题描述】:
目前我有以下关联的数据库:
- 一个客户对多个摄入量
- 一个摄入多个案例管理
- 一个案例管理多个干预
- 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 在数据库中创建了一个 Client、一个 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>
这是我的干预类层次结构的映射:
<?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 什么也不会说。
这快把我逼疯了,请帮忙:)
【问题讨论】:
标签: c# .net nhibernate inheritance nhibernate-mapping