HasOne Идентифицирующие отношения не сохраняются - PullRequest
1 голос
/ 17 декабря 2011

У меня есть идентифицирующая связь между двумя таблицами в базе данных.

Родительская таблица имеет первичный ключ, который создается с помощью Identity. Дочерняя таблица имеет первичный ключ, который является первичным ключом, созданным для идентификации из родительской таблицы. Это настоящий один на один.

Я пробовал несколько картографических стратегий со всеми видами результатов, но ни одна из них не была идеальной.

Файл родительского сопоставления имеет это (обратите внимание на Cascade.All () - я ожидаю, что родительский узел будет управлять отношениями):

HasOne(x => x.ChildObject).Cascade.All();

Дочернее отображение имеет это:

Id(Reveal.Member<ChildObject>("ID"))
.GeneratedBy.Foreign("ParentObject");
HasOne(Reveal.Member<ChildObject, ParentObject>("ParentObject"))
.Constrained()
.ForeignKey();

Я изменил имена объектов, чтобы защитить невинных.

Так вот что происходит. Я создаю экземпляр родительского элемента, создаю экземпляр дочернего элемента и устанавливаю отношения (добавьте дочерний элемент к родительскому элементу и родительский элемент к дочернему элементу).

Я запускаю этот код:

session.SaveOrUpdate(_Parent);
session.Clear();
transaction.Commit();

Что я ожидаю, так это то, что родительский объект будет сохранен с обновленным идентификатором в родительском элементе из базы данных. Затем идентификатор должен быть установлен в Child, а Child сохранен.

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

У Child есть идентификатор от родителя (он распространяется от Parent к Child правильно), но nHibernate не распознает Child как грязного (предположение с моей стороны). Даже если я явно попробую SaveOrUpdate для объекта Child, он не будет сохранен.

Но это становится немного страннее. Если я присоединяю коллекцию грязных объектов к дочернему объекту и вызываю SaveOrUpdate явно для дочернего объекта, nHhiberante сохраняет этот дочерний объект, а коллекция - ожидаемое поведение. Но я все еще должен назвать это явно.

Какую ошибку я совершил, сопоставляя отношения Родитель-Ребенок?

1 Ответ

1 голос
/ 19 декабря 2011

Я предполагаю, что parent.Id генерируется личностью.

строка session.SaveOrUpdate(_Parent); сохранит родительский элемент для получения его идентификатора и кэширует вставку дочернего элемента для очистки при фиксации. session.Clear(); удалит кэшированную вставку и transaction.Commit(); не найдет ничего, что можно сделать.

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