NHibernate Fluido de Muchos a Muchos


Estoy usando Fluent NHibernate y tengo algunos problemas para establecer una relación de muchos a muchos con una de mis clases. Probablemente sea un error estúpido pero he estado atascado un poco tratando de que funcione. De todos modos, tengo un par de clases que tienen Muchas-Muchas relaciones.

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 como este

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 corro mi prueba de integración, básicamente estoy creando una nueva persona y grupo. Agregar el Grupo a la Persona.Groupsown. Si recupero el Objeto Person del repositorio, el GroupsOwned es igual al grupo inicial, sin embargo, cuando recupero el grupo si compruebo count on Group.Administradores, la cuenta es 0. La tabla Join tiene el groupId y el PersonId guardados en ella.

Gracias por cualquier consejo que pueda tener.

Author: Rap, 2008-09-20

4 answers

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 siendo cambiados, NHibernate está persistiendo la relación dos veces (una para cada objeto). El atributo inverso es específicamente para evitar esto.

No estoy seguro de cómo añadirlo en la asignación en código, pero el enlace muestra cómo hacerlo en XML.

 39
Author: Santiago Palladino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-15 14:18:12

@ Santiago Creo que tienes razón.

La respuesta podría ser que necesita eliminar una de sus muchas declaraciones, mirando más Fluidamente parece que podría ser lo suficientemente inteligente como para hacerlo por usted.

 7
Author: emeryc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-21 03:31:53

Żestá seguro para agregar a la Persona a los Grupos.Admin? Tienes que hacer ambos enlaces.

 0
Author: emeryc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-20 16:44:01

Tienes tres mesas ¿verdad?

Personas, Grupos y Administradores de grupos

Cuando añades a ambos lados obtienes

Personas (con un id de p1) Grupos (con un id 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 ve como el 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 haces un nuevo contexto, y pruebas para ver qué hay en el contexto, y vuelves a lo correcto, ¿pero tus mesas están arruinadas?

 0
Author: emeryc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-20 17:48:43