Beaucoup à beaucoup suppriment la cascade dans NHibernate
J'ai un scénario dans un système que j'ai essayé de simplifier mieux que je peux. Nous avons une table de (permet de l'appeler) les artefacts, les objets peuvent être consultés par n'importe quel nombre de rôles de sécurité et les rôles de sécurité peut accéder à n'importe quel nombre d'objets. En tant que tel, nous avons 3 tables dans la base de données - un pour la description des artefacts, l'un décrivant les rôles et les plusieurs-à-plusieurs table d'association reliant artefact ID ID de Rôle.
Domaine sage, nous avons deux classes: l'une pour un rôle et une pour un artefact. l'objet de la classe a un IList propriété qui renvoie une liste de rôles qui peuvent y accéder. (Rôles, toutefois, ne pas offrir une propriété afin d'obtenir des objets qui peuvent être accessibles).
En tant que tel, le nhibernate pour la cartographie de l'artefact contient les éléments suivants;
<bag name="AccessRoles" table="ArtefactAccess" order-by="RoleID"
lazy="true" access="field.camelcase-underscore" optimistic-lock="false">
<key column="ArtefactID"/>
<many-to-many class="Role" column="RoleID"/>
</bag>
Tout cela fonctionne très bien et si je supprime un artefact, l'association de la table est nettoyée de façon appropriée et toutes les références entre l'retiré de l'artefact et les rôles sont supprimés (le rôle n'est pas supprimé si, correctement - comme nous ne voulons pas orphelins supprimé).
Le problème est comment faire pour supprimer un rôle et ont clairement l'association tableau automatiquement. Si j'ai actuellement essayez de supprimer un rôle, je reçois une référence de contrainte comme il y a encore entrées dans la table d'association pour le rôle. La seule façon de réussir à supprimer un rôle est d'effectuer des requêtes pour tous les objets de lien pour ce rôle, de supprimer le rôle de l'artefact du rôle de collecte, de mise à jour de l'objet et ensuite supprimer le rôle n'est pas très efficace ou agréable, surtout lorsque l'onu-système simplifié, les rôles peuvent être associés à un certain nombre d'autres tableaux/objets.
J'ai besoin d'être en mesure de faire allusion à NHibernate que je veux cette table d'association effacé à chaque fois que je supprime un rôle - est-ce possible, et si oui, comment puis - je le faire?
Merci pour toute aide.
source d'informationauteur deepcode.co.uk
Vous devez vous connecter pour publier un commentaire.
Depuis que je suis à la recherche pour répondre à cette question et a trouvé ce fil de discussion sur google (sans réponse) j'ai pensé poster ma solution à ce. Avec trois tables: Rôle, RolesToAccess(ManyToMany), de l'Accès.
Créer les mappages suivants:
Accès:
Rôles:
Comme mentionné ci-dessus, vous pouvez faire la RolesToAccess propriétés protégées afin de ne pas polluer votre modèle.
Ce que vous dites ici:
N'est pas nécessaire. Supposons que vous ne voulez pas la carte de la table d'association (en faire un objet de domaine), vous pouvez toujours effectuer des suppressions sur les deux extrémités avec un minimum de code.
Disons qu'il y a 3 tables: Rôle, Artefact, et ArtifactAccess (le lien de la table).
Dans votre mapping, vous n'avez que des objets de domaine pour le Rôle et l'Artefact. Les deux ont un sac pour les nombreuses de l'association.
Rôle:
Artefact:
Comme vous pouvez le voir, les deux extrémités ont inverse=false spécifié. Le NHibernate documentation vous recommande de choisir l'une des extrémités de votre association, en tant que "inverse" de la fin, mais rien ne vous empêche d'utiliser à la fois comme "le contrôle de la fin". Lors de l'exécution de mises à jour ou les inserts, cela fonctionne dans les deux directions sans accroc. Lors de l'exécution supprime de l'une des extrémités, vous obtenez un FK erreur de violation, car l'association de la table n'est pas mise à jour, c'est vrai. Mais vous pouvez résoudre ce problème en juste compensation de la collection à l'autre extrémité, avant d'effectuer le supprimer, ce qui est beaucoup moins complexe que ce que vous faites, qui est à la recherche de "l'autre" fin de l'association si il y a des utilisations de cette fin. Si c'est un peu déroutant, voici un exemple de code. Si vous avez seulement une fin en contrôle, pour votre complexe de supprimer ce que vous devez faire:
Ce que je fais lors de la suppression d'un rôle est quelque chose comme
C'est une ligne de code, mais de cette façon, vous n'avez pas besoin de prendre une décision sur la fin de l'association est l'inverse de la fin. Vous aussi n'avez pas besoin de carte de la table d'association pour un contrôle total.
Vous pourriez faire une cartographie de la table d'association, et ensuite appeler delete sur la table où le Role_id est la valeur que vous vous apprêtez à supprimer, puis effectuez les supprimer de le rôle lui-même. Devrait être assez simple à faire.
Bien que je crois que NHibernate doit fournir un moyen de le faire sans avoir la collection dans les rôles de classe C#, vous pouvez toujours définir le comportement de SQL. Sélectionnez sur supprimer en cascade pour la FK dans la base de données et il devrait être automatique, il suffit de regarder dehors pour le programme des ssna du cache.
Mais je conseille fortement l'utilisation de ce comme une dernière ressource.
Vous avez besoin pour créer un mappage de Rôle à
Artifact
.Vous pouvez faire du lazy-loading, et de l'associer à un protégé membre virtuel, de sorte qu'il n'a jamais obtient réellement accessibles, mais vous avez besoin que la cartographie là pour NHibernate à savoir qu'il doit supprimer les rôles de la
ArtefactAccess
table