Удалить из <Map> - PullRequest
       21

Удалить из <Map>

0 голосов
/ 07 августа 2009

У меня есть отображение:

<class name="User" table="Users" lazy="false">
  <id name="id" type="Int32" column="id">
    <generator class="identity" />
  </id>
  <property name="name" column="name" type="String"/>
  <map name="Urls" table="UserUrl" lazy="true" inverse="true" cascade="all">
     <key column="user_id"></key>
     <index column="url_type_id" type="Int32"/>
     <one-to-many class="UserUrl"/>
   </map>
</class>

<class name="UserUrl" table="UserUrl" lazy="false">
  <id name="id" type="Int32" column="id">
    <generator class="identity"/>
  </id>
  <property name="user_id" column="user_id" type="Int32" not-null="true"/>
  <property name="UrlType" column="url_type_id" type="Int32" not-null="true"/>
  <property name="Url" column="url" type="String" not-null="true"/>
</class>

Также я получаю

class User
{
  IDictionary<int,UserUrl> Urls;
 ....
}

User currentUser = FindById(2);
currentUser.Urls.Remove(5);

Итак, я убрал один предмет из коллекции ассоциаций Url. Затем я вызываю SaveOrUpdateCopy(...), но URL из таблицы UserUrl не удаляется и ошибки нет.

Кто-нибудь знает, как удалить дочерний элемент из коллекции и из БД?

Ответы [ 4 ]

1 голос
/ 07 августа 2009

Установить обратное значение false для элемента

.

0 голосов
/ 13 августа 2009

- Кстати, не отвечайте на свой вопрос, если вы на самом деле комментируете ответ. Вы можете быть проголосовали против

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

Также я узнаю, что рабочий код

<map name="Urls" lazy="true" cascade="all-delete-orphans" inverse="true">

без обратного = "true" не работает.

0 голосов
/ 07 августа 2009

Я пытаюсь выполнить поиск в Google, но нет никакой информации о разнице между <map><one-to-many > и <map><composite-element>, поэтому я использую <map><one-to-many >.
<map name="Urls" table="UserUrl" lazy="true" cascade="all-delete-orphans"> <key column="user_id"/> <index column="url_type_id" type="Int32"/> <composite-element> <property name="UrlType" column="url_type_id" type="Int32" not-null="true"/> <property name="Url" column="url" type="String" not-null="true"/> </composite-element> </map> <Ч /> Если URL-адрес не является независимой сущностью с собственным идентификатором, вы можете отобразить его
как составной элемент. URL обрабатывается как тип значения.
Больше нет отображения класса UserUrl. Я использую класс UserUrl в другом коде

0 голосов
/ 07 августа 2009

Попробуйте:

<map name="Urls" lazy="true" cascade="all-delete-orphans">
  • Вам не нужно table, потому что таблица определена в классе UserUrl mapping
  • Вы не должны делать этонаоборот, если это не
  • Вы должны каскадировать все это - удалить-сироту, чтобы сказать NH, чтобы удалить элементы, которые удалены из коллекции.

Не относится к вашемувопросы, почему у вас это в URL?

<property name="user_id" column="user_id" type="Int32" not-null="true"/>

Вы отображаете там внешний ключ!Я бы никогда не осмелился сделать это.


На самом деле, я не уверен, стоит ли вам отображать это так:

<map name="Urls" table="UserUrl" lazy="true" cascade="all-delete-orphans">
   <key column="user_id"/>
   <index column="url_type_id" type="Int32"/>
   <composite-element>
     <property name="UrlType" column="url_type_id" type="Int32" not-null="true"/>
     <property name="Url" column="url" type="String" not-null="true"/>
   </composite-element>
 </map>

Если URL-адрес не являетсянезависимая сущность, имеющая собственный идентификатор, тогда вы можете отобразить его как составной элемент.URL обрабатывается как тип значения.Больше нет отображения классов UserUrl.

Редактировать:

  • См. Справочную главу NH 7 , в которой объясняются компоненты.
  • Если у вас возникают проблемы со значениями, не равными NULL, просто удалите ограничение не-NULL для внешнего ключа.NH должен вставить несколько столбцов, чтобы получить первичные ключи, если вы используете generator class="identity", поэтому он хранит временный ноль.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...