Как определить, изменился ли объект nHibernate - PullRequest
0 голосов
/ 29 июня 2010

Возможно глупый вопрос, но я все еще пытаюсь обернуть голову вокруг nHibernate.

Насколько я могу судить по использованию программного обеспечения, nHibernate требует от вас немного дополнительной обработки для правильного сохранения изменений.

Давайте представим, что у меня есть объект X, который может содержать множество объектов Y. Я создам X, у которого есть 2 Y, каждый из которых имеет свои собственные свойства. Затем я решаю, что хочу обновить X. Я собираюсь добавить новый Y и изменить один из существующих Y.

Итак, я загружаю свой объект X, используя его идентификатор. Затем я перебираю Y, которые добавляю, добавляю их в X и сохраняю лот, используя оператор обновления.

Если вы сделаете это, вы обнаружите, что «старые» Y осиротели в базе данных. Что, когда я думаю об этом, именно то, что я ожидал бы случиться - в конце концов, я не избавился от этих объектов, я просто создал несколько новых.

Так что есть два способа взглянуть на это. Либо я должен удалить все данные Y и затем заново создать их, либо я должен иметь возможность отметить до nHibernate, что то, что я делаю, является изменением и что оно должно обновлять существующие объекты, а не создавать новые , Проблема в том, что я не уверен, какой подход является «правильным» или как лучше всего это сделать - первый кажется чрезвычайно неэффективным, а второй означает установку большого количества «измененных» флагов и очень сложного кода.

Так что я почти уверен, что должно быть более простое решение, которого мне не хватает в моей глупости. Может кто-нибудь указать мне на лучший подход и как лучше всего справиться с ним в nHibernate ... то есть, если вопрос вообще имеет какой-либо смысл:)

Ура, Matt

1 Ответ

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

Возможно, у вас проблема с отображением или использованием.

Правильно настроено, ваше использование должно быть примерно таким:

using (var session = sessionFactory.OpenSession())
using (var tx = session.BeginTransaction())
{
    var x = session.Get<X>(theId);
    x.Ys[0].SomeProperty = theNewValue;
    x.Ys.Add(theNewY);
    tx.Commit();
}

Вы должны опубликовать более подробную информацию о реальных классах, отображениях и использовании.

Кроме того, я предлагаю вам прочитать документы полностью: http://nhibernate.info/doc/nh/en/index.html. Это всего несколько часов, которые избавят вас от многих дней разочарования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...