Удалить из коллекции, не работающей в Nhibernate - PullRequest
2 голосов
/ 03 июля 2010

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

У меня есть объект Item, который содержит коллекцию itemdocument,Используя nhibernate для связи с базой данных, я могу легко добавить в свою коллекцию itemdocument, обновить элементы в ней и т. Д., Но что бы я ни делал, я не могу удалить.

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

Если я использую Session.Delete () для itemdocument в коллекции, а затем яповторно сохраняя объект item (не удаляя itemdocument из коллекции), он фактически создает новый объект, чего и следовало ожидать.Так что это говорит мне, что мои Save работают.

Я надеюсь, что все это имеет смысл, я немного расстроен и, возможно, не так ясно, как я хочу ...

Смотрите мои отображениядля объекта item:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="namespace.Business.BusinessEntity">

  <class name="Item, namespace" table="[dbo].[Item]">

    <id name="ItemId" column="ItemId" type="Int32" unsaved-value="0">
      <generator class="identity" />
    </id>       

    <property name="ItemCode" column="ItemCode" type="String" length="50" />
    <property name="InternalDescription" column="InternalDescription" type="String" length="254" />
    <property name="IsEnabled" column="IsEnabled" type="Boolean" />
    <property name="Size" column="Size" type="String" length="50" />      

    <set name="Pictures" cascade="all-delete-orphan" inverse="true" >
      <key column="ItemId" not-null="true"/>
      <one-to-many class="ItemDocument" />
    </set>

  </class>
</hibernate-mapping>

Отображение для объекта Itemdocument:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="namespace.Business.BusinessEntity">

  <class name="ItemDocument, namespace" table="[dbo].[ItemDocument]">

    <id name="ItemDocumentId" column="ItemDocumentId" type="Int32">
      <generator class="identity" />
    </id>       

    <property name="Order" column="[Order]" type="Int32"  />

    <many-to-one name="Item" class="Item" column="ItemId" not-null="true" />
    <many-to-one name="Document" class="Document" column="DocumentId"  cascade="save-update" not-null="true"/>

  </class>
</hibernate-mapping>

Код для удаления:

//This does nothing
item.Pictures.Remove(item.Pictures.ElementAt(0));
session.SaveOrUpdate(item);

//This neither
session.Delete(item.Pictures.ElementAt(0));
item.Pictures.Remove(item.Pictures.ElementAt(0));
session.SaveOrUpdate(item);

Ответы [ 2 ]

4 голосов
/ 04 июля 2010

Может быть, это просто частичный код, но нет вызова session.Flush(). Ничего не сохраняется в базе данных до тех пор, пока не будет вызван Flush (для режима FlushMode по умолчанию Auto). Попробуйте это:

item.Pictures.Remove(item.Pictures.ElementAt(0));
session.Flush();

Вам нужно вызвать SaveOrUpdate, только если элемент является временным объектом. Предполагая, что вы уже получили элемент, используя NHibernate, то он постоянный. Глава 9 в документации есть детали.

Редактировать: Картинки - это обратная сторона, поэтому вы должны установить нулевую ссылку на "много" стороне коллекции:

var pictureToRemove = item.Pictures.ElementAt(0);
pictureToRemove.Item = null;
item.Pictures.Remove(pictureToRemove);
session.Flush();
0 голосов
/ 03 июля 2010

Вы пытались удалить предмет коллекции, а затем повторно получить предмет?как получить ссылку на элемент, который вы хотите удалить, удалить его, а затем использовать hql для повторного получения обновленного объекта?

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