Внешний ключ Nhibernate как составной ключ - PullRequest
3 голосов
/ 09 августа 2010

Привет, я довольно новичок в Nhibernate и работаю над проектом, который описывается следующим образом:

1 Таблица «Родители», содержащая ParentName и один-ко-многим ChildrenList с использованием IList, с Первичным ключом, установленным в ParentId

1 Таблица «Дочерние», с составным первичным ключом, который содержит ParentID в качестве одного из ключей

поэтому я настроил один ко многим в Parents.hbm.xml следующим образом

<class name="ParentName " table="Parents">
<id name="ParentName " column="ParentName ">
<generator class="assigned"/>
</id>
<property name="ParentAlpha" />
<bag name="ChildrenList" cascade="all">
<key column="ParentName" />
<one-to-many class="Children"/>
</bag>

и Children.hbm.xml вот так

<composite-id>
<key-many-to-one name="ParentName" class="Parent"/>
<key-property name = "ChildrenAlpha" />
<key-property name = "ChildrenAlpha2"/>
</composite-id>
<property name="ChildrenBeta" />
<property name="ChildrenGama" />

И в настоящее время я делаю тест по сохранению Parent obj с некоторым списком Children в базе данных MySQL, используя метод session.SaveOrUpdate, но он всегда терпит неудачу и просто говорит, что «не может вставить» Children Obj

Вот мой тестовый код:

Parent parent = new Parent(){ParentAlpha= "ABC"};
Children children = new Children(){ChildrenAlpha = "AAA" ,ChildrenAlpha2 ="VBB"};
parent .ChildrenList.add(children); //IList add function
.....session.SaveOrUpdate(parent);

Я проверил одного родителя на множество детей, и первичный ключ для детей установлен на сгенерированный ChildrenId. и это работает нормально. Но почему-то я не могу сделать это с использованием составного ключа, я предполагаю, что, поскольку ParentName в Children является первичным ключом, он будет заполнен только после того, как ParentName в Parent был заполнен, ну что-то в этом роде.

Другой вопрос: если вышеуказанная проблема решена, могу ли я использовать ее для получения всего родительского объекта со списком детей? (Я пробовал это для простого случая с одним ПК, но, кажется, не работает, когда дети - это составной ключ)

Parent parent= session.CreateCriteria(typeof(Parent))
                    .Add(Restrictions.Eq("ParentName", ParentName))
                    .UniqueResult<Parent>();
NHibernateUtil.Initialize(parent.ChildrenList);

Спасибо!

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