2016-06-23 2 views
0

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

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). –

+0

voir si cela aide http://nhibernate.info/blog/2008/09/06/soft-deletes.html –

+0

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

Répondre

0

Vous ne pouvez pas accéder aux champs de base de données qui ne sont pas mappés.

Faites de la relation une entité régulière et ne le supprimez pas, mais définissez l'indicateur IsDeleted.

Envisagez également de ne pas filtrer dans le fichier de mappage, mais lorsque vous accédez à la liste à un endroit où vous ne souhaitez pas voir les éléments supprimés. Il est juste plus transparent et fonctionne donc plus facilement.

+0

Vous ne trouvez pas que c'est sale d'inclure la table? Cela signifie que je devrais l'ajouter à la cartographie en utilisant HasMany ... Cela ajoute également de la complexité supplémentaire en particulier lors de l'ajout de nouveaux éléments (forcée de créer une instance de la nouvelle classe ProductOrder). – Beejee