Pregunta

Buscando una respuesta sobre cómo configurar NHibernate para admitir mi escenario, un mapa de muchos a muchos con una relación objetivada.

Tengo una colección de Persona: s con relaciones con otra Persona: s. Cada una de las relaciones tiene un atributo que especifica qué tipo de relación tienen. En un RDB, esto se hace mediante el uso de una tabla de muchos a muchos con el tipo de relación especificado en esa tabla, el modelo puede ampliarse permitiendo más tipos, p. " amigo cercano " y "archienemigo".

Me gustaría poder consultar un objeto Persona para devolver todas las Personas relacionadas por tipo

<IList>Person myEnemies =  myPerson.getRelatedPersons(relationType.Enemy)

o

<IList>Person myFriends = myPerson.getRelatedPersons(relationType.Friend)

Otra solución (menos extensible) sería especificar estáticamente en la clase qué otras relaciones existen:

public class Person   
{   
  public virtual int Id { get; private set; }   
  public virtual string FirstName { get; set; }   
  public virtual string LastName { get; set; }   
  public virtual IList<Person> Friends { get; set; }   
  public virtual IList<Person> Enemies { get; set; }   
}

En este momento, tengo que usar una base de datos heredada con una " Persona " tabla, así como una "PersonaPersona" mesa. El " PersonPerson " La tabla contiene el tipo de relación como un entero.

He intentado hacer esto usando la sintaxis como la siguiente sin éxito hasta ahora ...

// How to specify type=1  here?
HasManyToMany(x => x.Friends).WithTableName("Person_Person"); 

// How to specify type=2  here?
HasManyToMany(x => x.Enemies).WithTableName("Person_Person"); 

¿Algún consejo / solución para mapear esto con NHibernate (fluido)?

BR

/ Jens

¿Fue útil?

Solución

El primer ejemplo del que habla parece que necesita investigar un mapeo de herencia, pero no estoy seguro de cómo funcionaría con la tabla adicional involucrada.

El segundo ejemplo debería poder usar la cláusula Where.

HasManyToMany(x => x.Friends)
  .WithTableName("Person_Person")
  .Where("type = 2");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top