2009-02-16 10 views
15

Tengo clases de Publicar y Comentar, y tienen una relación de uno a muchos donde Publicar tiene una lista de Comentarios. ¿Cómo puedo mapear esto como una relación unidireccional con Fluent NHibernate, ya que un comentario no necesita conocer su Publicador principal? Actualmente, este es mi asignación para Comentario:Fluido NHibernate mapeo unidireccional de uno a muchos

Id(x => x.Id); 
Map(x => x.Body); 
References(x => x.User); 

y de la publicación:

Id(x => x.Id); 
Map(x => x.Title); 
HasMany(x => x.Comments) 
    .Inverse() 
    .WithKeyColumn("PostId") 
    .Cascade.AllDeleteOrphan(); 

Esto no funciona porque cuando trato de guardar un ejemplo del anuncio con un comentario que acaba de agregar, la clave externa en el comentario (PostId) se deja NULL. Y, por supuesto, un comentario no se puede guardar con un NULL PostId. Intenté eliminar la cláusula .Inverse(), pero eso tampoco funciona.

+3

Se metió en esto yo mismo. Muy molesta limitación IMO. –

+1

Es posible con NH3.1 y superior, ver mi respuesta a otra pregunta similar http://stackoverflow.com/questions/4466153/nhibernate-configuration-for-uni-directional-one-to-many-relation/7601312# 7601312 – hazzik

Respuesta

22

NHibernate no admite esta asignación cuando tiene una restricción no nula en su clave externa. Si elimina esa restricción, verá que NHibernate inserta los Comentarios con un PostId nulo, y luego los actualiza con el ID de la nueva Publicación.

o hay que hacer:

  1. Retire la restricción no nulo y la Inverse llamada
  2. Mantener la restricción y el mapa de la otra cara de la relación (haciendo de esta una relación bidireccional , y permitiendo Inverse funcione correctamente)

Esto se trata en la NHibernate documentation for one-to-many's, ver la Nota Muy Importante al final.

+0

enlace roto, fyi. –

+1

No, no lo es. El sitio puede haber estado inactivo temporalmente, pero el enlace definitivamente sigue siendo válido. –

+1

Gracias por la respuesta. Es una pena que NH funcione de esta manera, no veo ninguna razón por la que debería. –

Cuestiones relacionadas