2010-06-29 3 views
0

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

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

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

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

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

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

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

Приветствия, Matt

ответ

1

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

Правильно сконфигурированные ваше использование должно быть что-то вроде этого:

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. Это всего лишь несколько часов, это избавит вас от многих разочарований.

Смежные вопросы