2011-03-25 1 views
1

J'essaie de créer un mappage un-à-un dans mon application, j'ai essayé plusieurs échantillons que j'ai trouvés dans Stackoverflow et d'autres endroits, mais pas succès jusqu'à présent.Comment créer un mappage un-à-un dans NHibernate en utilisant les attributs de mappage

J'ai une classe de commande et une classe de réservation. Plusieurs commandes peuvent exister sans réservation, mais les réservations doivent toujours avoir une commande.

Mon plan est de mettre le FK dans le tableau de réservation et le code est le suivant:

class Order 
    { 
    ... 
    [OneToOne(Cascade = "all-delete-orphan")]   
    public Reservation Reservation 
    { 
     get; 
     private set; 
    } 
    } 

et réservation de classe:

class Reservation 
{ 
    ... 
    [ManyToOne(Column = "order_id", NotNull=true, Unique=true)]   
    public Order Order 
    { 
     get; 
     set; 
    } 
} 

Cela fonctionne bien, mais lorsque je tente de supprimer un ordre:

session.Delete(myOrder); 
session.FlushSession(); 

Je reçois une exception de violation FK en raison de la réservation FK étant nulle, mais Je m'attendais à ce que la réservation soit automatiquement supprimée en raison du paramètre Cascade.

Des suggestions?

Merci

+0

je ne sais pas comment cela fonctionne avec des attributs, mais vous pourriez avoir besoin de mettre 'inverse = true' dans la propriété de réservation de l'ordre. – ChrisAnnODell

+0

On dirait que vous n'avez pas une relation 1 à 1 entre 'Order' et' Reservation' mais une relation plusieurs à un, et ce que Chris a dit, vous devez marquer l'un d'entre eux comme 'inverse = true'. – R0MANARMY

+0

ChrisAnnODell: Je ne vois pas d'option inverse dans la propriété Reservation de la classe Order. R0MANARMY beaucoup d'endroits suggèrent d'utiliser le ManyToOne comme je l'ai fait, je trouve le problème, voir la réponse ci-dessous. – bcsanches

Répondre

0

J'ai trouvé le problème: quand une commande a été chargé, il a essayé de rechercher une réservation en utilisant une clause comme: « Où order.id = revervation.id », mais en fait il fallait vérifier le FK dans la table de réservation: "WHERE order.id = reservation.order_id"

Pour cette raison, la réservation n'a jamais été correctement chargée et lorsqu'une commande a été supprimée, aucune réservation n'a été supprimée, le résultat a été que la commande a été supprimée à partir de la base de données et lorsque le flush a été émis, la contrainte FK a été violée car la réservation était toujours là.

Pour résoudre le problème, je l'ai changé le code de commande à:

[OneToOne(Cascade="all-delete-orphan", ForeignKey="none", PropertyRef="Order", Lazy=Laziness.Proxy)]   
    public Reservation Reservation 
    { 
     get; 
     private set; 
    } 

Notez le paramètre "PropertyRef".

Merci

Questions connexes