2016-06-23 8 views
0

Я ищу способ остановить элементы, которые удаляются из таблицы многих из многих. Я нашел сообщение о том, что могу использовать IPostCollectionRemoveEventListener и/или IPostCollectionRecreateEventListener. Проблема в том, что ни один из них не запускается.Nhibernate Many to Many Soft Удалить

Пример:

Допустим, у нас есть таблица продуктов и заказ столика. Заказ может состоять из нескольких продуктов. Продукт можно продавать несколько раз (поэтому он упоминается в нескольких заказах). Это место, где многие из многих Table, ProductOrder, встают на свои места. Все эти таблицы имеют столбцы IsDeleted даже многие для многих.

Многие из многих таблиц непосредственно не отображаются в моем проекте C#. Я использую HasManyToMany.

Mapping продукта:

HasManyToMany(x => x.Orders) 
    .ChildKeyColumn("OrderId") 
    .AsSet() 
    .ParentKeyColumn("ProductId") 
    .LazyLoad() 
    .Table("ProductOrder") 
    .Not.Inverse() 
    .Where("IsDeleted != 1"); 

Отображение заказа:

HasManyToMany(x => x.Products) 
    .ChildKeyColumn("ProductId") 
    .AsSet() 
    .ParentKeyColumn("OrderId") 
    .LazyLoad() 
    .Table("ProductOrder") 
    .Not.Inverse() 
    .Where("IsDeleted != 1"); 

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

Пример кода, как я удаляю и сохраняю изменения:

var order = ...; 
var product= ...; 
product.Orders.Remove(order); 
... 
SessionHandler.CurrentSession.Update(product); 
SessionHandler.CurrentSession.Flush(); 
+0

Вам не нужно вызывать обновление в сеансе (если все объекты привязаны, то есть они исходят из запроса, а не из-за пределов сеанса). –

+0

см., Если это помогает http://nhibernate.info/blog/2008/09/06/soft-deletes.html –

+0

Я опробовал DefaultDeleteEventListener, но он запускается только при использовании в сущности, а не в коллекции объектов. – Beejee

ответ

0

Вы не можете получить доступ к полям БД, которые не отображаются.

Сделать отношение регулярным сущностью и не удалять его, а установить флаг IsDeleted.

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

+0

Разве вы не думаете, что это грязно, чтобы включить стол? Это означает, что я должен добавить его к сопоставлению с помощью HasMany ... Он также добавляет дополнительную сложность, особенно при добавлении новых элементов (вынужденных сделать экземпляр нового класса ProductOrder). – Beejee