2010-12-06 30 views
1

mon application a 2 entités appelées événement et transaction. Un événement peut ou peut ne pas avoir une transaction, mais ne peut avoir que Transaction. Je pensais que la meilleure façon de cartographier cela était avec une cartographie HasOne. Jusqu'à présent, tout va bien, mais je veux m'assurer que lorsque vous supprimez un événement, il ne le supprimera pas s'il a une transaction.NHibernate - Pas d'inverse sur un-à-un

Normalement sur une relation HasMany je voudrais simplement définir un Inverse et changer Cascade à Aucun. Lorsque Cascade existe, Inverse ne le fait pas et l'événement est supprimé, qu'il ait ou non une transaction.

Je vous serais reconnaissant si quelqu'un pouvait me montrer la bonne façon de le faire. Merci

Répondre

3

Vous pouvez toujours créer votre propre comportement supprimer personnalisé à l'aide d'un DeleteEventListener:

public class DeleteEventListener : DefaultDeleteEventListener 
    { 
    protected override void DeleteEntity(IEventSource session, object entity, EntityEntry entityEntry, bool isCascadeDeleteEnabled, IEntityPersister persister, ISet transientEntities) 
    { 
     Event event = entity as Event; 
     if (event != null && event.Transaction != null) throw new Exception("You can't delete this Event! Look! It has a Transaction!"); 
     CascadeBeforeDelete(session, persister, entity, entityEntry, transientEntities); 
     CascadeAfterDelete(session, persister, entity, transientEntities); 
    } 
    } 

Cette DeleteEventListener devrait alors être enregistré dans le cadre de la configuration de votre configuration NHibernate. Dans l'élément usine de session:

<event type="delete"> 
<listener class="myNamespaces.DeleteEventListener, myAssembly" /> 
</event> 

Je ne l'ai pas testé ce code particulier, mais je code similaire dans mon application afin que je puisse aider si vous êtes bloqué.

+0

Merci, c'est probablement la voie à suivre puisque mon cas est probablement une exigence de logique métier. – nfplee

1

un-à-un signifie qu'il n'y a pas de clé étrangère, mais une clé primaire synchronisée. cela signifie que la clé primaire de l'événement provient de la transaction.

Cela n'a rien à voir avec les cascades. Inverse indique qu'une relation partage la clé étrangère avec une autre relation. Par exemple, s'il y a une liste (un-à-plusieurs), elle contient les mêmes informations que la référence inverse de l'élément dans la liste à son conteneur. Donc, il n'a pas besoin de stocker cette information deux fois dans la base de données, il est marqué "inverse"

Dans la plupart des cas, plusieurs-à-un est le bon choix. Autant que je sache, elle s'appelle couramment "Références".

+0

Salutations mais je n'ai aucune référence à la transaction sur mon événement. Je suppose que je pourrais mettre un champ nullable et utiliser une référence, mais je ne suis pas friand de cette approche. Potentiellement ma structure de base de données permet un scénario de un à plusieurs, donc HasMany a plus de sens car le fait que mon événement ne peut avoir qu'une seule transaction est plus une exigence de l'entreprise. Cependant, je préférerais toujours la propriété Transaction sur mon événement pour retourner une seule entité et non une liste. – nfplee