orm - una - relacion uno a varios ejemplos
Asignación de muchos a muchos con columnas adicionales en la tabla de unión (5)
Cambiaría el nombre de CertificatesAcquiredByPeople por algo
como CertificatesAcquiredEvent (implica que hay más de una clave y una fecha y hora)
Acepto que debe ser una entidad separada en lo que respecta a NHibernate.
Aquí está el dominio que deseo tener:
public class Person
{
public int Id { get; set; }
public IList<AcquiredCertificate> AcquiredCertificates { get; set; }
}
public class AcquiredCertificate
{
public Person Acquirer { get; set; }
public Certificate Certificate { get; set; }
public DateTime DateAcquired;
}
public class Certificate
{
public int Id { get; set; }
}
Y este es el esquema que tengo:
CREATE TABLE People (
PersonId INT PRIMARY KEY
);
CREATE TABLE Certificates (
CertificateId INT PRIMARY KEY
);
CREATE TABLE CertificatesAcquiredByPeople (
PersonId INT,
CertificatedId INT,
DateAcquired DATETIME
);
Es un esquema y dominio artificial, pero es más o menos lo mismo que algo con lo que estoy trabajando. Actualmente lo tengo trabajando escribiendo una tercera entidad de dominio para representar la tabla CertificatesAcquiredByPeople, pero eso realmente me parece extraño.
¿Cómo mapearía esto usando NHibernate? Creo que la etiqueta componente en el archivo hbm debería hacer lo que quiero, pero no puedo entenderlo.
¿Está mi dominio fuera de control porque tengo una propiedad Fechada en mi clase de Certificado? La fecha realmente es solo una preocupación de una persona que tiene un certificado.
[Editar]
He alterado el modelo de dominio ahora para reflejar que se necesita una nueva entidad. Ahora para el mapeo necesito 3 (para cada entidad) mapeos o puedo hacerlo con 2 (para Persona y Certificado)?
Creo que necesitas 3, si alguna vez vas a obtener el valor de DateTime.
Su implementación es exactamente correcta. Su tabla de unión incluye los dos campos clave (haciendo una clave primaria compuesta para la tabla) y el campo de fecha y hora es superfluo para eso. De hecho, es un atributo adicional en la tabla de unión y para eso necesita una entidad.
En un diagrama de clase UML, también se mostraría como un atributo en la unión.
Por diseño, NHibernate solo admite el mapeo implícito de muchos a muchos si no hay absolutamente NADA más que el par de FK representados en la tabla intermedia (intermedia) que mantiene la relación de muchos a muchos.
Hace un tiempo, Billy McCafferty blogueó sobre este ''problema'' exacto (no es realmente un problema ya que es BY DESIGN) ...
Re: su Q actualizada, necesitará tres asignaciones, una para cada una de las tres entidades que ahora participan en el par de relaciones de uno a muchos.