我正在开发一个使用Nhibernate并且最近遇到非常奇怪的行为的ASP.NET应用程序。
我的Biz对象中有patient-> patientAddress映射。患者可以有多个地址,但在患者表中我们有一个mailingAddress列,指向Patint_Mailing表中的一行。我的映射文件是这样的。
<many-to-one name="mailingAddress"
column="mailingAddress"
class="DataLoad.Biz.PatientAddress, DataLoadBiz" />
我正在生成包含患者信息的csv文件,我希望此文件包含所有患者及其邮寄地址。这有时候工作得非常好,但有时并非如此。
例如,如果患者A具有AddressA和AddressB。我们选择AddressB作为应用程序中的邮寄地址。如果我编译并运行,我将获得带有AddressB的患者A的csv文件。现在,如果我进入SQL并删除患者A并使用相同的设置重新创建患者A,我将获得带有地址A的患者A的csv文件,即使在数据库中它表示患者A具有邮寄地址地址B
有人想过为什么这种暴力行为?
这是我的患者映射文件
<many-to-one name="practice"
column="practice"
class="DataLoad.Biz.Practice, DataLoadBiz" />
<many-to-one name="mailingAddress"
column="mailingAddress"
class="DataLoad.Biz.PatientAddress, DataLoadBiz" />
<bag name="addresses" lazy="false" >
<key column="patient"/>
<one-to-many class="DataLoad.Biz.PatientAddress, DataLoadBiz"/>
</bag>
<bag name="mailings" table="MAILING_PATIENT">
<key column="patient"></key>
<many-to-many column="mailing" class="DataLoad.Biz.Mailing, DataLoadBiz" />
</bag>
这是PatientAddress映射文件
<many-to-one name="patient"
column="patient"
class="DataLoad.Biz.Patient, DataLoadBiz" />
一旦我使用正确的邮寄地址更新患者详细信息,我就可以访问数据库并查看其是否已正确更新。所以那里没有问题。但是当nhibernate从数据库中读取这些值时,它似乎忽略了我更新了mailddeess的事实
我有一个带有原始地址字段和邮件地址字段的Web表单。用户可以将原始地址复制到邮件地址,当他们单击“下一步”按钮时,我会在患者类中调用AddAddress()方法
public virtual void AddAddress(ref PatientAddress Address)
{
Address.patient = this;
this.addresses.Add(Address);
}
在我的Dao对象中我调用了Save方法
patientAddressDao.Save(updatedAddress);
然后我用正确的更新地址更新患者对象的邮寄地址
patient.mailingAddress = updatedAddress;
答案 0 :(得分:1)
如果您保存Patient类,请确保您的Patient类在地址集映射中具有Cascade =“All”或“all-delete-orphan”。
当您说“我们选择AddressB作为邮寄地址”时,您是否在地址类中设置了一个标志?
<强>更新强>
如果您保存患者类,如果您有双向映射,则在地址集合映射的Patient类中也使用inverse =“true”。
<强>更新强>
您提供的代码只是添加一个新地址,但不“选择”它。你只需要一个列表,两个地址指的是一个病人。你把地址标记为mailaddress在哪里?
<强>更新强>
<many-to-one cascade="all" inverse="true" name="mailingAddress"
column="mailingAddress"
class="DataLoad.Biz.PatientAddress, DataLoadBiz" />
和
patientDao.SaveOrUpdate(patient);