Frage

Ich bin mit Fluent NHibernate und einige Probleme mit einer viele zu viele Beziehung Setup mit einer meiner Klassen zu bekommen. Es ist wahrscheinlich ein dummer Fehler, aber ich habe für ein wenig stecken versucht, es zum Laufen zu bringen. Wie auch immer, ich habe ein paar Klassen, die viele-viele Beziehungen haben.

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; }
}

Mit der Zuordnung wie folgt aussehen

Person: ...

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

Gruppen: ...

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

Wenn ich meine Integrationstest laufen, im Grunde eine neue Person und Gruppe Ich schaffe. Das Hinzufügen der Gruppe zum Person.GroupsOwned. Wenn ich die Person Objekt wieder aus dem Repository erhalten, die GroupsOwned an die erste Gruppe gleich ist, aber wenn ich die Gruppe zurück, wenn ich Zählung überprüfen Group.Admins, ist die Zahl 0. Die Join-Tabelle die GroupID hat und die PersonID gespeichert darin.

Vielen Dank für jede Beratung gerne zur Verfügung.

War es hilfreich?

Lösung

Die Tatsache, dass es zwei Datensätze der Tabelle ist das Hinzufügen sieht aus wie Sie eine invers-Attribut . Da sowohl die Person und die Gruppe geändert werden, wird persistierende NHibernate die Beziehung zweimal (einmal für jedes Objekt). Das inverse Attribut ist speziell diese zu vermeiden.

Ich bin mir nicht sicher, wie es in Abbildung in Code hinzufügen, aber der Link zeigt, wie es in XML zu tun.

Andere Tipps

@Santiago Ich glaube, du hast Recht.

Die Antwort könnte nur sein, dass Sie einen Ihrer ManyToMany Erklärungen entfernen müssen, mehr bei Fluent sucht es sieht aus wie es klug genug sein könnte, tun Sie es einfach für Sie.

Sind Sie dafür, dass die Person auf dem Groups.Admin hinzufügen? Sie müssen beide Links machen.

Sie haben drei Tabellen nicht wahr?

Menschen, Gruppen und GroupAdministrators

Wenn Sie auf beiden Seiten hinzufügen, die Sie bekommen

Menschen (mit einem ID von p1) Gruppen (mit einer ID von g1)

und in GroupAdministrators haben Sie zwei Spalten und eine Tabelle, die hat

(p1, g1)

(p1, g1)

und Ihr Unit-Test-Code sieht wie folgt aus.

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();

Und dann in Ihrem Test, den Sie einen neuen Kontext zu machen, und Test, um zu sehen, was im Rahmen ist, und Sie das Richtige zurück, aber Ihre Tische sind alle muckte auf?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top