Domanda

Sto usando Fluent NHibernate e sto riscontrando problemi nell'ottenere una configurazione da molte a molte relazioni con una delle mie lezioni. Probabilmente è un errore stupido, ma sono rimasto bloccato per un po 'cercando di farlo funzionare. Comunque, ho un paio di lezioni che hanno relazioni Many-Many.

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

Con la mappatura simile a questa

Persona: ...

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

Gruppi: ...

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

Quando eseguo il test di integrazione, fondamentalmente sto creando una nuova persona e un nuovo gruppo. Aggiunta del gruppo a Person.GroupsOwned. Se ottengo l'oggetto Person dal repository, GroupsOwned è uguale al gruppo iniziale, tuttavia, quando ottengo il gruppo indietro se controllo il conteggio su Group.Admins, il conteggio è 0. La tabella Join ha GroupID e il PersonID salvato in esso.

Grazie per qualsiasi consiglio tu possa avere.

È stato utile?

Soluzione

Il fatto che stia aggiungendo due record alla tabella sembra che manchi un attributo inverso . Poiché sia ??la persona che il gruppo vengono cambiati, NHibernate persiste due volte la relazione (una volta per ogni oggetto). L'attributo inverse serve specificamente a evitarlo.

Non sono sicuro di come aggiungerlo nella mappatura nel codice, ma il link mostra come farlo in XML.

Altri suggerimenti

@Santiago Penso che tu abbia ragione.

La risposta potrebbe essere che devi rimuovere una delle tue dichiarazioni ManyToMany, guardando più fluentemente sembra che potrebbe essere abbastanza intelligente da farlo solo per te.

Stai assicurando di aggiungere la Persona ai Groups.Admin? Devi creare entrambi i collegamenti.

Hai tre tavoli vero?

Amministratori di persone, gruppi e gruppi

quando aggiungi ad entrambi i lati ottieni

Persone (con un ID di p1) Gruppi (con un ID di g1)

e in GroupAdministrators hai due colonne e una tabella che ha

(p1, g1)

(p1, g1)

e il codice del test unitario è simile al seguente.

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

E poi nel tuo test crei un nuovo contesto e provi a vedere cosa c'è nel contesto, e ottieni la cosa giusta, ma i tuoi tavoli sono tutti confusi?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top