2012-02-17 4 views
1

Nous sommes confrontés au problème de l'application de plusieurs-à-plusieurs relation en utilisant l'automapping nhibernate fluent.Beaucoup à plusieurs relation en utilisant Fluent Nhibernate Automapping

La forme simplifiée du modèle de domaine sont les suivantes:

public class Group 
{ 
    private readonly IList<Recipient> _recipients = new List<Recipient>(); 
    public virtual IList<Recipient> Recipients 
    { 
     get { return _recipients; } 
    } 
} 

public class Recipient 
{ 
    private readonly IList<Group> _groups = new List<Group>(); 
    public virtual IList<Group> Groups 
    { 
     get { return _ groups; } 
    } 
} 

Comme le code décrit ci-dessus que le groupe et le bénéficiaire ayant plusieurs à plusieurs. Nous utilisons la fonction automapping de nhibernate fluent pour mapper notre modèle de domaine avec la base de données. Nous devions donc utiliser la Convention pour l'automapping. code suivant est nous avons utilisé pour plusieurs à plusieurs congrès: -

public class ManyToManyConvention : IHasManyToManyConvention 
{ 
    #region IConvention<IManyToManyCollectionInspector,IManyToManyCollectionInstance> Members 

    public void Apply(FluentNHibernate.Conventions.Instances.IManyToManyCollectionInstance instance) 
    { 
     if (instance.OtherSide == null) 
     { 
      instance.Table(
       string.Format(
        "{0}To{1}", 
        instance.EntityType.Name + "_Id", 
        instance.ChildType.Name + "_Id")); 
     } 
     else 
     { 
      instance.Inverse(); 
     } 
     instance.Cascade.All(); 
    } 

    #endregion 
} 

J'ai trouvé cette solution ici:

http://blog.vuscode.com/malovicn/archive/2009/11/04/fluent-nhibernate-samples-auto-mapping-part-12.aspx#Many%20to%20Many%20convention

Mais dans le code ci-dessus pendant le débogage du temps pour> Groupes et receveurs pour Groupes-> Destinataire instance.OtherSide ne vient pas nul. L'hypothèse était la première fois instance.OtherSide ne sera pas nul et la deuxième fois il sera nul comme la relation est appliquée d'un côté, donc nous allons juste appliquer inverse à cela. Il crée donc 2 tables de correspondance qui sont identiques. Il est chargé dans la base de données d'avoir 2 tables du même schéma. Même lorsque j'essaie de sauvegarder notre modèle de domaine dans une base de données en utilisant de nombreuses relations. Il enregistre seulement 1 côté, c'est-à-dire qu'il enregistre les destinataires dans les groupes, mais n'enregistre pas les groupes dans les destinataires. Dans la base de données, il n'a pas d'entrée dans une seule table de mappage. Donc, la question est: faisons-nous la bonne chose? Si non alors comment le faire.

+0

version de FNH utilisez-vous? – Firo

+0

@Firo - C'est 1.2.0.0 – Niraj

Répondre

2

vous pouvez prendre lui-même inverse comme critère

public void Apply(IManyToManyCollectionInstance instance) 
    { 
     Debug.Assert(instance.OtherSide != null); 
     // Hack: the cast is nessesary because the compiler tries to take the Method and not the property 
     if (((IManyToManyCollectionInspector)instance.OtherSide).Inverse) 
     { 
      instance.Table(
       string.Format(
        "{0}To{1}", 
        instance.EntityType.Name + "_Id", 
        instance.ChildType.Name + "_Id")); 
     } 
     else 
     { 
      instance.Inverse(); 
     } 
     instance.Cascade.All(); 
    } 
+0

si (instance.OtherSide == null || ((IManyToManyCollectionInspector) instance.OtherSide) .Inverse) – dariol

+0

@ dario-g voir l'assertion? 'instance.OtherSide == null' a besoin d'une réflexion supplémentaire dans l'autre – Firo

Questions connexes