Question

J'utilise Fluent NHibernate et j'ai quelques problèmes pour configurer plusieurs relations avec l'une de mes classes. C'est probablement une erreur stupide mais j'ai été coincé un peu pour essayer de le faire fonctionner. Quoi qu'il en soit, j'ai quelques classes qui ont de nombreuses relations.

public class Person
{
    public Person()
    {
        GroupsOwned = new List<Groups>();
    }

    public virtual IList<Groups> GroupsOwned { get; set; }
}

public class Groups
{
    public Groups()
    {
        Admins= new List<Person>();
    }

    public virtual IList<Person> Admins{ get; set; }
}

Le mappage ressemble à ceci

Personne: ...

HasManyToMany<Groups>(x => x.GroupsOwned)
    .WithTableName("GroupAdministrators")
    .WithParentKeyColumn("PersonID")
    .WithChildKeyColumn("GroupID")
    .Cascade.SaveUpdate();

Groupes: ...

 HasManyToMany<Person>(x => x.Admins)
    .WithTableName("GroupAdministrators")
    .WithParentKeyColumn("GroupID")
    .WithChildKeyColumn("PersonID")
    .Cascade.SaveUpdate();

Lorsque je lance mon test d'intégration, je crée essentiellement une nouvelle personne et un nouveau groupe. Ajout du groupe à Person.GroupsOwned. Si je récupère l'objet Personne du référentiel, GroupsOwned est égal au groupe initial. Toutefois, lorsque je récupère le groupe si je vérifie le compte sur Group.Admins, le nombre est égal à 0. La table Join contient l'identificateur GroupID et le PersonID enregistré dedans.

Merci pour vos conseils.

Était-ce utile?

La solution

Le fait qu'il ajoute deux enregistrements à la table donne l'impression qu'il manque un attribut inverse . Étant donné que la personne et le groupe changent, NHibernate maintient la relation deux fois (une fois pour chaque objet). L'attribut inverse est spécifiquement destiné à éviter cela.

Je ne sais pas comment l'ajouter dans le mappage dans le code, mais le lien montre comment le faire en XML.

Autres conseils

@Santiago, je pense que vous avez raison.

La réponse est peut-être simplement que vous devez supprimer une de vos déclarations ManyToMany. Si vous regardez plutôt Fluent, vous aurez l’impression de pouvoir le faire pour vous.

Assurez-vous d’ajouter la personne aux groupes.Admin? Vous devez faire les deux liens.

Vous avez trois tables non?

Personnes, groupes et administrateurs de groupe

lorsque vous ajoutez des deux côtés, vous obtenez

Personnes (avec un identifiant de p1) Groupes (avec un identifiant de g1)

et dans GroupAdministrators vous avez deux colonnes et une table qui a

(p1, g1)

(p1, g1)

et votre code de test unitaire ressemble à ce qui suit.

Context hibContext //Built here
Transaction hibTrans //build and start the transaction.

Person p1 = new Person()
Groups g1 = new Groups()

p1.getGroupsOwned().add(g1)
g1.getAdmins().add(p1)

hibTrans.commit();
hibContext.close();

Ensuite, dans votre test, vous créez un nouveau contexte et testez pour voir ce qu’il contient, et vous récupérez la bonne chose, mais vos tables sont toutes détruites?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top