Nhibernate не возвращает обновленные значения - PullRequest
0 голосов
/ 29 июня 2011

Я работаю над приложением ASP.NET, которое использует Nhibernate и в последнее время сталкивается с очень странным поведением.

У меня есть сопоставление пациента-> терпеливого адреса в моем объекте Biz. Пациент может иметь более одного адреса, но в таблице пациента у нас есть столбец mailingAddress, который указывает на строку в таблице Patint_Mailing. мой файл сопоставления похож на это.

 <many-to-one name="mailingAddress" 
            column="mailingAddress"
            class="DataLoad.Biz.PatientAddress, DataLoadBiz" />

Я создаю CSV-файл с информацией о пациенте, и я ожидаю, что в этот файл будут включены все пациенты и их почтовые адреса. Иногда это работает абсолютно нормально, но иногда это не так.

Например, если у пациента A есть AddressA и AddressB. Мы выбираем AddressB в качестве почтового адреса в приложении. Если я скомпилирую это и запущу, я получу файл csv с пациентом A с AddressB. Теперь, если я войду в SQL и удалю пациента A и заново создаю пациента A с той же настройкой, я получу файл csv с пациентом A с адресом A, даже если в базе данных указано, что пациент 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 читает эти значения обратно из БД, кажется, что он игнорирует тот факт, что я обновил maildadraeess

У меня есть веб-форма с полями «Исходный адрес» и «Почтовый адрес». Пользователь может скопировать оригинальный адрес в почтовый адрес, и когда он нажимает кнопку «Далее», я вызываю метод AddAddress () в классе моего пациента

    public virtual void AddAddress(ref PatientAddress Address)
    {
        Address.patient = this;
        this.addresses.Add(Address);
    }

и в моем объекте Dao я вызываю метод Save

patientAddressDao.Save(updatedAddress);

затем я обновил почтовый адрес объекта пациента на правильный обновленный адрес

patient.mailingAddress = updatedAddress;

1 Ответ

1 голос
/ 29 июня 2011

Если вы сохраняете класс «Пациент», убедитесь, что в вашем классе «Пациент» в отображении набора адресов есть Cascade = «All» или «all-delete-orphan».

Когда вы говорите «Мы выбираем AddressB в качестве почтового адреса», вы устанавливаете флаг в классе адресов?

обновление

Если вы сохраняете класс «Пациент», используйте также inverse = «true» в классе «Пациент» при отображении набора адресов, если у вас есть двунаправленное отображение.

обновление

код, который вы предоставляете, просто добавляет новый адрес, но не "выбирает" его. У вас просто список из двух адресов относится к одному пациенту. Где вы помечаете адрес как почтовый адрес?

обновление

 <many-to-one cascade="all" inverse="true" name="mailingAddress" 
    column="mailingAddress"
    class="DataLoad.Biz.PatientAddress, DataLoadBiz" />

и

patientDao.SaveOrUpdate(patient);
...