c# - framework - relacion muchos a muchos entity
Fluido NHibernate de muchos a muchos (4)
¿Estás asegurándote de agregar la Persona a los Grupos.Admin? Tienes que hacer ambos enlaces.
Estoy usando Fluent NHibernate y tengo algunos problemas para obtener una configuración de relación de muchos a muchos con una de mis clases. Probablemente sea un error estúpido, pero he estado estancado un poco tratando de hacerlo funcionar. De todos modos, tengo un par de clases que tienen 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 que se parece a esto
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 de persona del repositorio, GroupsOwned es igual al grupo inicial, sin embargo, cuando recupero el grupo si comprobo el recuento en Group.Admins, el recuento es 0. La tabla Join tiene el ID de grupo y el PersonID guardado en él.
Gracias por cualquier consejo que pueda tener.
@Santiago, creo que tienes razón.
La respuesta podría ser simplemente que necesita eliminar una de sus declaraciones ManyToMany, mirando más a Fluent, parece que podría ser lo suficientemente inteligente como para hacerlo por usted.
El hecho de que agregue 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 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 en la asignación en el código, pero el enlace muestra cómo hacerlo en XML.
Tienes tres mesas ¿verdad?
Personas, grupos y GroupAdministrators
cuando agregas a ambos lados obtienes
Personas (con una identificación de p1) Grupos (con una identificación de g1)
y en GroupAdministrators tiene dos columnas y una tabla que tiene
(p1, g1)
(p1, g1)
y el código de prueba de su unidad tiene el siguiente aspecto.
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 su prueba, crea un nuevo contexto y prueba para ver qué hay en el contexto, y obtiene lo correcto, pero ¿sus tablas están todas malgastadas?