Pregunta

Estoy usando Fluent NHibernate y tengo algunos problemas para configurar una relación de muchos a muchos con una de mis clases.Probablemente sea un error estúpido, pero me he quedado atascado un rato intentando que funcione.De todos modos, tengo un par de clases que tienen relaciones Muchos-Muchos.

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 el mapeo luciendo así

Persona:...

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

Grupos:...

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

Cuando ejecuto mi prueba de integración, básicamente estoy creando una nueva persona y grupo.Agregar el grupo a Person.GroupsOwned.Si recupero el Objeto Persona del repositorio, GroupsOwned es igual al grupo inicial; sin embargo, cuando recupero el grupo si verifico el recuento en Group.Admins, el recuento es 0.La tabla Join tiene el GroupID y el PersonID guardados en ella.

Gracias por cualquier consejo que puedas tener.

¿Fue útil?

Solución

El hecho de que esté agregando dos registros a la tabla parece que le falta un atributo inverso.Dado que tanto la persona como el grupo están cambiando, NHibernate persiste la relación dos veces (una para cada objeto).El atributo inverso es específicamente para evitar esto.

No estoy seguro de cómo agregarlo al mapeo en el código, pero el enlace muestra cómo hacerlo en XML.

Otros consejos

@Santiago Creo que tienes razón.

La respuesta podría ser simplemente que necesita eliminar una de sus declaraciones ManyToMany; si analiza más Fluent, parece que podría ser lo suficientemente inteligente como para hacerlo por usted.

¿Se está asegurando de agregar la persona a Groups.Admin?Tienes que hacer ambos enlaces.

Tienes tres mesas ¿verdad?

Personas, grupos y administradores de grupos

cuando sumas a ambos lados obtienes

Grupos de personas (con una identificación de P1) (con una identificación de G1)

y en GroupAdministrators tienes dos columnas y una tabla que tiene

(p1,g1)

(p1,g1)

y su código de prueba unitaria se parece al siguiente.

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

Y luego, en tu prueba, creas un nuevo contexto, pruebas para ver qué hay en el contexto y obtienes lo correcto, pero ¿tus tablas están todas desordenadas?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top