2010-07-03 2 views
2

Я знаю, что вокруг этого много, но я пытался все, что мог видеть какое-то время, но все равно не повезло.Удалить из коллекции, не работающей в Nhibernate

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

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

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

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

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

<?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> 

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); 
+0

Является ли это завернутые внутри любого рода сделки? – apollodude217

+0

Я не уверен, что это имеет значение здесь, но если несохраненная ценность ItemDocumentId равна 0? – apollodude217

+0

ItemDocumentId не является 0, потому что он существует. Вы говорите, что я должен сделать это 0, если я хочу его удалить? Для транзакции нет разницы, если я использую один или нет. Выполнение обновления в ItemDocument сохраняется в БД, поэтому я предполагаю, что транзакции не являются моей проблемой здесь. – David

ответ

0

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

+0

Я не уверен, что я за тобой, у тебя есть пример? – David

3

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

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

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

Edit: Фотографии, обратная сторона, так что вы должны установить ссылку на нуль на «многие» стороне коллекции:

var pictureToRemove = item.Pictures.ElementAt(0); 
pictureToRemove.Item = null; 
item.Pictures.Remove(pictureToRemove); 
session.Flush(); 
+0

Если я это сделаю: item.Pictures.ElementAt (0) .Order = 9; session.Flush(); Он запускает обновление против базы данных (то же самое, если я делаю SaveOrUpdate()). Если я делаю то же, что и вы поставили выше, ничего не происходит. Это то же самое для всех моих коллекций, я чего-то не получаю ... – David

+0

Все еще ничего не делает на стороне SQL Server. Если я попытаюсь сделать Session.Delete (pictureToRemove); Ошибка при ошибке, указав, что свойство not-null установлено равным null. – David

Смежные вопросы