Nhibernate没有返回更新的值

时间:2011-06-29 15:07:05

标签: asp.net nhibernate nhibernate-mapping

我正在开发一个使用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;

1 个答案:

答案 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);