2 votes

Problème de mappage automatique NHibernate

Récemment, j'ai rencontré un comportement étrange dans l'automapping de Fluent NHibernate. J'ai la structure de classe suivante (certaines propriétés ont été coupées pour des raisons de concision).

public class UserGroup
{
    public virtual UserGroup ParentGroup { get; set; }

    public virtual UserGroupMember Manager { get; protected set; }

    public virtual ISet Members { get; protected set; }
}

et

public class UserGroupMember : BaseEntity
{
    public virtual User User { get; set; }

    public virtual UserGroup Group { get; set; }
}

Le mapping pour UserGroup:

public class UserGroupMap : IAutoMappingOverride
{
    public void Override(AutoMapping mapping)
    {
        mapping.HasMany(el => el.Members)
            .Cascade
            .AllDeleteOrphan().Inverse().LazyLoad();
    }
}

L'automapping crée deux colonnes (toutes deux des clés étrangères) dans la table UserGroupMember pour refléter la relation entre UserGroup et UserGroupMembers. J'ai découvert que le mapping généré contient la mauvaise colonne (comme on peut le voir ci-dessous):

ce qui entraîne des requêtes incorrectes:

  1. Lors de l'insertion dans UserGroupMember - Group_Id est utilisé (ce qui est correct), et non Pasrent_Id
  2. Lors de la sélection dans UserGroupMember - Parent_Id est utilisé

Group_Id est la colonne du fichier de mapping UserGroupMember qui reflète la propriété Group dans UserGroupMember.

J'ai essayé de modifier le mapping en ajoutant .KeyColumn("Group_Id") et cela résout le problème. Mais y a-t-il un moyen de faire en sorte que Fluent NHibernate 'pense de la bonne manière'?

0voto

mathieu Points 17729

Ceci est de mémoire, car je n'ai pas de code de test prêt.

Lorsque vous utilisez une relation bidirectionnelle many-to-many, vous devez parfois aider FHN à trouver les noms des colonnes, s'ils ne sont pas "semblables" des deux côtés.

Par exemple, cela devrait être mappé correctement

public class User
{
    public IList Groups { get; set; }
}

public class Group    
{
    public IList Users { get; set; }
}

Alors que ceci ne le ferait pas

public class User
{
    public IList BelongsTo { get; set; }
}

public class Group    
{
    public IList Contains { get; set; }
}

En règle générale, si l'automappage (avec ou sans conventions) ne génère pas correctement les noms des colonnes, surtout pour des cas non triviaux, n'hésitez pas à écraser pour définir manuellement ces noms de colonnes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X