2011-04-22 2 views
2

Je dois supprimer les membres EndPoint qui sont mappés sur SlotTransceivers et Ports. Dans le passé, EndPoint n'a pas sa propre table, ce cklass faisait partie de SlotTransceiver et Port.Cascade.All() ne supprime pas cascade, pourquoi?

Le problème est que parce que la création de connexion, rhitch a référence à EndPoints, je devais avoir créé propre table pour EndPoints. Il y avait plus de problèmes, mais maintenant tout fonctionne bien, sauf la suppression en cascade des lignes EndPoints. Je crois que j'ai besoin d'écrire des classes de remplacement pour EndPoint et Connections ou de changer ces classes pour Ports ou SlotTransceivers.

Pouvez-vous me donner n'importe quelle dirrection? Je ne suis pas l'auteur de classes originales et je suis Noob dans Hibernate.

Je pensais que Cascade.All() signifie que lorsque je supprime un SlotTransceiver ou Port, il supprime automatiquement EndPoint référencé.

N'y a-t-il pas problème qu'il y ait une référence possible de la nouvelle table Connexion?

Il y a des classes:

public class EndPoint : Entity 
    { 
     private int _Position; 
     private VLAN _VLAN; 
     private string _Description; 
     private Connection _Connection; 

     [Min(0)] 
     public virtual int Position 
     { 
      get 
      { 
       return _Position; 
      } 
      set 
      { 
       _Position = value; 
      } 
     } 

     [NotNull] 
     public virtual VLAN VLAN 
     { 
      get 
      { 
       return _VLAN; 
      } 
      set 
      { 
       _VLAN = value; 
      } 
     } 

     [Length(500)] 
     public virtual string Description 
     { 
      get 
      { 
       return _Description; 
      } 
      set 
      { 
       _Description = value; 
      } 
     } 
    } 

    public class SlotTransceiver : Entity 
    { 
     private EndPoint _EndPoint; 
     private SlotTransceiverItem _InType; 
     private Slot _Slot; 

     [NotNull] 
     public virtual EndPoint EndPoint 
     { 
      get 
      { 
       return _EndPoint; 
      } 
      set 
      { 
       _EndPoint = value; 
      } 
     } 

     [NotNull] 
     public virtual SlotTransceiverItem InType 
     { 
      get 
      { 
       return _InType; 
      } 
      set 
      { 
       _InType = value; 
      } 
     } 

     [NotNull] 
     public virtual Slot Slot 
     { 
      get 
      { 
       return _Slot; 
      } 
     } 
    } 

    public class Port : Item 
    { // Item is inherited from Entity 
     private EndPoint _EndPoint; 
     [NotNull] 
     public virtual EndPoint EndPoint 
     { 
      get 
      { 
       return _EndPoint; 
      } 
      set 
      { 
       _EndPoint = value; 
      } 
     } 
    } 

    public class Connection : Entity 
    { 
     private EndPoint _EndPointIn; 
     private EndPoint _EndPointOut; 

     [NotNull] 
     public virtual EndPoint EndPointIn 
     { 

      get 
      { 
       return _EndPointIn; 
      } 
      set 
      { 
       _EndPointIn = value; 
      } 
     } 
     [NotNull] 
     public virtual EndPoint EndPointOut 
     { 

      get 
      { 
       return _EndPointOut; 
      } 
      set 
      { 
       _EndPointOut = value; 
      } 
     } 

    } 

Ils sont une cartographie spéciale:

public class SlotTransceiverOverride : IAutoMappingOverride<SlotTransceiver> 
    { 
     public void Override(FluentNHibernate.Automapping.AutoMapping<SlotTransceiver> mapping) 
     { 
      // in past EndPoint columns are in SlotTrancievers resp. in Ports tables 
      /* 
      mapping.Component(x => x.EndPoint, m => 
      { 
       m.Map(x => x.Position); 
       m.Map(x => x.Description); 
       m.References(x => x.VLAN).ForeignKey("SlotTransceiversEndPointVLANFkConstraint"); 
      });*/ 
      mapping.References(x => x.InType).Not.LazyLoad(); 
      mapping.References(x => x.EndPoint).Not.LazyLoad().Cascade.All(); 
     } 
    } 

     public void Override(FluentNHibernate.Automapping.AutoMapping<Port> mapping) 
     { 
      // in past EndPoint columns are in SlotTrancievers resp. in Ports tables 
     /* 
      mapping.Component(x => x.EndPoint, m => 
      { 

       m.Map(x => x.Position); 
       m.Map(x => x.Description); 
       m.References(x => x.VLAN).ForeignKey("PortsEndPointVLANFkConstraint"); 
      }); 
       */ 
      mapping.IgnoreProperty(x => x.AbsoluteIndex); 
      mapping.References(x => x.EndPoint).Not.LazyLoad(); 
      mapping.References(x => x.EndPoint).Cascade.All(); 
     } 

Répondre

0

En combinant les attributs NH et des trucs AutoMapping FNH semble très effrayant. Je ne comprends pas du tout, mais Classique Classique IMO est beaucoup plus transparent. Vous devez payer avec plus de coups de touches mais votre tête fait moins mal :).

public class EndPointMap : ClassMap<EndPoint> 
{ 
    public EndPointMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Position); 
     Map(x => x.Description); 
    } 
} 

public class ConnectionMap : ClassMap<Connection> 
{ 
    public ConnectionMap() 
    { 
     Id(x => x.Id); 

     References(x => x.EndPointIn) 
      .Cascade.All() 
      .Not.LazyLoad(); 
     References(x => x.EndPointOut) 
      .Cascade.All() 
      .Not.LazyLoad(); 
    } 
} 

et ce code supprime la connexion et le point final et la base de données:

using (var session = OpenSession()) 
{ 
    var connection = session.Get<Connection>(connectionId); 
    session.Delete(connection); 
    session.Flush(); 
} 
+0

Merci pour la réponse. Je pense que non seulement la cartographie FNH, mais tous les NH semble très effrayant. Je ne comprends pas tout mais il semble qu'il fasse ce qu'il devrait faire. Parfois... – Zdenek

Questions connexes