powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate many-to-one cascade="save-update"
5 сообщений из 5, страница 1 из 1
NHibernate many-to-one cascade="save-update"
    #38386780
maratoss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой набор таблиц как на картинке и классов соответственно.
Пытаюсь удалить из коллекции ChemicalIndicatorValues объекта CertificateQuality пару элементов и делаю Update, ничего не выходит.
Если добавляю в коллекцию и вызываю Update, то нормально добавляется в БД.

Подскажите почему не удаляет?
И еще вопрос: как гибернейт узнает, что объект изменился и генерит запрос в БД?

Вот код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
             var planCertificate =
                 session.Query<PlanCertificate>()
                     .Fetch(x => x.CertificateQuality)
                     .ThenFetch(x => x.ChemicalIndicatorValues)
                     .ToList().First(x => x.Rn == 1008027991L);

             var dto = planCertificate.MapTo<PlanCertificateDto>();
             planCertificate = dto.MapTo<PlanCertificate>();

             session.Clear();
             session.Dispose();

             // тут удаляю все из коллекции
             planCertificate.CertificateQuality.ChemicalIndicatorValues.Clear();
             var chemicalIndicatorValue = new ChemicalIndicatorValue
                                              {
                                                  Value = "2",
                                                  ChemicalIndicator = new DictionaryChemicalIndicator { Rn = 1008019070 },
                                                  CertificateQuality = planCertificate.CertificateQuality
                                              };
             // тут добавляю в коллекцию
             planCertificate.CertificateQuality.ChemicalIndicatorValues.Add(chemicalIndicatorValue);

             session = connection.GetSessionFactory().OpenSession();

             session.Update(planCertificate);
             session.Flush();
             session.Dispose();



Маппинги:
PlanCertificate
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping schema="PARUS" assembly="ParusModel" namespace="ParusModel.Entities.PlanReceiptOrderDomain" xmlns="urn:nhibernate-mapping-2.2">
  <class name="PlanCertificate" table="v_UDO_PCOSERT_obj" select-before-update="true">
    <id name="Rn" type="Int64">
      <column name="RN" not-null="true" precision="17" scale="0" sql-type="NUMBER" />
      <generator class="identity" />
    </id>
    <many-to-one name="CertificateQuality" class="ParusModel.Entities.CertificateQualityDomain.ManufacturersCertificateDomain.CertificateQuality" cascade="save-update">
      <column name="RN_QUALCERT" default="null" not-null="false" precision="17" scale="0" sql-type="NUMBER" />
    </many-to-one>
</hibernate-mapping>



CertificateQuality
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping schema="PARUS" assembly="ParusModel" namespace="ParusModel.Entities.CertificateQualityDomain.ManufacturersCertificateDomain" xmlns="urn:nhibernate-mapping-2.2">
  <class name="CertificateQuality" table="v_UDO_QUAL_CERT_obj" select-before-update="true">
    <id name="Rn" type="Int64" >
      <column name="RN" not-null="true" precision="17" scale="0" sql-type="NUMBER" />
      <generator class="identity" />
    </id>   
    <one-to-one name="PlanCertificate" class="ParusModel.Entities.PlanReceiptOrderDomain.PlanCertificate, ParusModel" property-ref="CertificateQuality" />
    <bag name="Passes" generic="true" cascade="all-delete-orphan" inverse="true" batch-size="100">
      <key>
        <column name="PRN" />
      </key>
      <one-to-many class="ParusModel.Entities.CertificateQualityDomain.ManufacturersCertificateDomain.Pass" />
    </bag>  
    <bag name="ChemicalIndicatorValues" generic="true" cascade="all-delete-orphan" inverse="true" batch-size="100">
      <key>
        <column name="PRN" />
      </key>
      <one-to-many class="ParusModel.Entities.CertificateQualityDomain.ManufacturersCertificateDomain.ChemicalIndicatorValue, ParusModel" />
    </bag>
   </class>
</hibernate-mapping>
...
Рейтинг: 0 / 0
NHibernate many-to-one cascade="save-update"
    #38387099
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maratossЕсть такой набор таблиц как на картинке и классов соответственно.
Пытаюсь удалить из коллекции ChemicalIndicatorValues объекта CertificateQuality пару элементов и делаю Update, ничего не выходит.
Если добавляю в коллекцию и вызываю Update, то нормально добавляется в БД.
NHibernate построен на сессионности, т.е. каждая сессия - это Unit of work. А вы пытаетесь удалять из объекта данные, когда сессия уже закрыта. Это detached объект, и NHibernate его не контролирует.

maratossПодскажите почему не удаляет?
И еще вопрос: как гибернейт узнает, что объект изменился и генерит запрос в БД?
NHibernate генерерует proxy-объекты на лету, и возвращает не реальные сущности, а их наследников. Поэтому при вызовах соответсвующих методов сравнивает значения с оригинальными, и таким образом отмечает объект как измененный.
...
Рейтинг: 0 / 0
NHibernate many-to-one cascade="save-update"
    #38387654
maratoss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorNHibernate построен на сессионности, т.е. каждая сессия - это Unit of work. А вы пытаетесь удалять из объекта данные, когда сессия уже закрыта. Это detached объект, и NHibernate его не контролирует.
Пытался приаттачить объект методом session.merge(PlanCertificate), но изменения в БД при аттаче не скидываются и возвращается объект, который лежит в БД с заполненной коллекцией.

Почему при мердже он не скидывает изменения?
Может нужно как-то подсказать ему что свойство у объекта изменилось?
...
Рейтинг: 0 / 0
NHibernate many-to-one cascade="save-update"
    #38387672
maratoss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати если написать так, то после мерджа сохраняет в БД, а после апдейта удаляет из БД:

Код: c#
1.
2.
var test = session.Merge(planCertificate.CertificateQuality);
session.Update(test);
...
Рейтинг: 0 / 0
NHibernate many-to-one cascade="save-update"
    #38387682
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maratoss,

вы всё равно пытаетесь плыть против течения. Merge стоит использовать только в крайних случаях, когда возникают ошибки при работе с бд или что-нибудь в этом духе. В остальных случаях держите сессию открытой пока не завершите всю работу с ней.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate many-to-one cascade="save-update"
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]