2011-05-11 21 views
5

Aquí están las piezas relevantes. Se trata de un objeto padre:NHibernate: asignación de uno a muchos bidireccional con semántica IList

public class Article 
{ 
    public virtual IList<ArticleRevision> Revisions { get; set; } 
} 

<list name="Revisions" cascade="all" inverse="true" table="ArticleRevision"> 
    <cache usage="read-write" /> 

    <key column="ArticleID" not-null="true" /> 
    <index column="Number" type="int32" /> 
    <one-to-many class="ArticleRevision" /> 
</list> 

Este es un niño:

public class ArticleRevision 
{ 
    public virtual Article Article { get; set; } 
} 

<many-to-one name="Article" column="ArticleID" not-null="true" /> 

Ahora, puedo crear una instancia de Article, agregue ArticleRevision a Article.Revisions colección, sistema ArticleRevision.Article hacer referencia a la Article instancia y empujón a la base de datos:

INSERT 
INTO 
    ArticleRevision 
    (Content, Keywords, CreatedAt, SiteID, ArticleID, CreatedByUserID, ID) 
VALUES 
    (@p0, @p1, @p2, @p3, @p4, @p5, @p6); 

Sin Number columna se inserta.

¿Cómo correlao correctamente una colección bidireccional uno a muchos con semántica de lista en NHibernate?

Respuesta

6

Desde el NHibernate documentation:

Tenga en cuenta que NHibernate no soporte bidireccional uno-a-muchos asociaciones con un índice colección (lista, mapa o matriz) como el extremo "N" , tiene que usar un conjunto o mapeo de bolsa .

1

Por lo que yo sé, Todas ORM marcos estado que cuando se tiene una relación bidireccional, debe definir un lado, en la cual su ORM se basará en la hora de actualizar el estado de su relación bi-direccional . De lo contrario, puede sufrir efectos adversos tales como

  • mapeo inconsistente
  • Violación de restricciones
  • Entre otras materias

En su caso, la ArticleID columna pueden ser manejados por ambos extremos de la relación. Por eso, debe marcar un lado como inverse = "true", que debe colocarse en muchos lados cuando tenga una relación @OneToMany.

Sin embargo, se puede lograr el mismo comportamiento mediante la desactivación de la ArticleRevision.Article propiedad, estableciendo su asignación como

<many-to-one name="Article" column="ArticleID" insert="false" update="false" /> 

Usando inserto = "false" update = "false", usted está diciendo: NHibernate, no se preocupa por mí, en el cual, como resultado, NHibenate simplemente lo ignoras. Ahora, descarta inverse = "false" en la propiedad Article.Revisions, y obtendrás tu respuesta.

ACTUALIZACIÓN:

Retire no-null = "true" de la columna de clave, ya que se actualiza inmediatamente después de ArticleRevision. Como consecuencia, obtendrá una violación de restricción de lo contrario.

Cuestiones relacionadas