Nhibernate - сохранение объекта с зависимыми таблицами - PullRequest
3 голосов
/ 14 марта 2012

У меня есть объект User, который в качестве одного из свойств содержит свойство Photos, которое относится к типу IList.

Таблицы в базе данных SQL объединяются внешним ключом. т.е.

Таблица User {userid long NOT NULL .......} Таблица UserPhoto {photoid long NOT NULL, userid long, ненулевые ссылки [User] .UserId ........}

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

То, что я хочу сделать, это создать пользовательский объект в коде, добавить список объектов UserPhoto (который должен обязательно содержать пустой идентификатор пользователя, так же как и объект пользователя, поскольку он не был сохранен и создан). по идентификатору вставьте еще)

Мои отображения таковы:

 <class name="User" table="[User]">
    <id name="UserId" column="Id">
      <generator class="identity" />
    </id>
    <bag name="Photos" order-by="DisplayOrder asc" cascade="all">      
      <key column="UserId" />
      <one-to-many class="UserPhoto" />
    </bag>
 </class>
<class name="UserPhoto" table="UserPhoto">
    <id name="PhotoId" column="Id">
      <generator class="identity" />
    </id>
    <property name="UserId" />
</class>

Но когда я пытаюсь сохранить объект User с помощью Nhibernate Session.Save (пользователь), он выдает ошибку о том, что ограничение внешнего ключа не выполнено. Так что я угадываю, что он пытается вставить либо пользовательские фотографии в список перед пользовательской таблицей, ИЛИ не устанавливать вновь созданное свойство идентификатора пользователя на фотографиях и пытается сохранить их с нулевым идентификатором пользователя.

Нужно ли иметь что-то дополнительное в отображении, чтобы показать, что это столбец внешнего ключа и к чему он применяется, поэтому nhibernate знает, как вставить зависимые строки в правильном порядке, чтобы я мог выполнить это за одну вставку?

Ответы [ 3 ]

1 голос
/ 14 марта 2012

попробуйте это:

 <class name="User" table="[User]">
    <id name="UserId" column="Id">
      <generator class="identity" />
    </id>
    <bag name="Photos" order-by="DisplayOrder asc" cascade="all" inverse="true">      
      <key column="UserId" />
      <one-to-many class="UserPhoto" />
    </bag>
 </class>
<class name="UserPhoto" table="UserPhoto">
    <id name="PhotoId" column="Id">
      <generator class="identity" />
    </id>
    <many-to-one name="User" property-ref="UserId" column="UserId"/>
</class>

Inverse = true добавлено в сумку с фотографиями

http://bchavez.bitarmory.com/archive/2007/10/06/nhibernate-and-inversetruefalse-attribute.aspx

Также изменил элемент UserId на пользовательский элемент «многие к одному»

0 голосов
/ 14 марта 2012

Вам либо нужно добавить inverse = "true" в отображение для коллекции фотографий

<bag name="Photos" order-by="DisplayOrder asc" cascade="all" inverse="true">

, либо вам нужно будет сделать столбец UserID обнуляемым в таблице фотографий.

Если вы выберете первый вариант, вам нужно будет самостоятельно настроить отношения между объектами:

var user = new User();
var photo = new Photo();
photo.User = user;
user.Photos.Add(photo);

Если установлено значение inverse = "true", NH вставит пользователя, обновит идентификатор пользователя на основе значения идентификатора, а затемвставьте каждую фотографию, указав идентификатор пользователя в таблице фотографий с каждой вставкой.

Без установки обратного = "true", NH вставит фотографии с нулевым идентификатором пользователя, выберет все идентификаторы фотографий для вставленных фотографий и затем выдастобновление для установки идентификатора пользователя после.Это приведет к созданию дополнительного оператора SQL.

0 голосов
/ 14 марта 2012

Вам нужно добавить inverse="true" в сумку, иначе NHibernate попытается сделать вставку с последующим обновлением:

<bag name="Photos" order-by="DisplayOrder asc" cascade="all" inverse="true">      
  <key column="UserId" />
  <one-to-many class="UserPhoto" />
</bag>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...