Je suis à la recherche d'un moyen d'empêcher le retrait d'éléments de la table plusieurs à plusieurs. J'ai trouvé un message indiquant que je pourrais utiliser IPostCollectionRemoveEventListener et/ou IPostCollectionRecreateEventListener. Le problème est qu'aucun d'eux n'est déclenché.Nhibernate Many to Many Supprimer
Exemple:
Disons que nous avons un tableau produit et une table Ordre. Une commande peut comporter plusieurs produits. Un produit peut être vendu plusieurs fois (il est donc référencé dans plusieurs commandes). C'est là que la Table de plusieurs à plusieurs, ProductOrder, entre en place. Toutes ces tables ont une colonne IsDeleted même les plus nombreuses.
La table plusieurs à plusieurs n'est pas mappée directement dans mon projet C#. Je fais usage du HasManyToMany.
Cartographie du produit:
HasManyToMany(x => x.Orders)
.ChildKeyColumn("OrderId")
.AsSet()
.ParentKeyColumn("ProductId")
.LazyLoad()
.Table("ProductOrder")
.Not.Inverse()
.Where("IsDeleted != 1");
Cartographie de l'Ordre:
HasManyToMany(x => x.Products)
.ChildKeyColumn("ProductId")
.AsSet()
.ParentKeyColumn("OrderId")
.LazyLoad()
.Table("ProductOrder")
.Not.Inverse()
.Where("IsDeleted != 1");
Tout cela fonctionne très bien, jusqu'à ce que je supprimer des éléments de la collection des produits ou des commandes. Cela provoque une suppression complète alors que je préfère utiliser une suppression logicielle en définissant la propriété IsDeleted sur 1 mais je n'arrive pas à trouver un moyen d'empêcher l'instruction delete ...
Exemple de code de la façon dont je supprime et enregistre les modifications:
var order = ...;
var product= ...;
product.Orders.Remove(order);
...
SessionHandler.CurrentSession.Update(product);
SessionHandler.CurrentSession.Flush();
Vous n'avez pas besoin d'appeler update sur la session (étant donné que les entités sont toutes attachées, ce qui signifie qu'elles proviennent d'une requête et non de l'extérieur de la session). –
voir si cela aide http://nhibernate.info/blog/2008/09/06/soft-deletes.html –
J'ai essayé le DefaultDeleteEventListener mais il n'est déclenché que lorsqu'il est utilisé sur une entité et non sur une collection d'entités. – Beejee