2011-05-11 6 views
5

Voici les pièces pertinentes. Ceci est un objet parent:NHibernate: mappage bidirectionnel un-à-plusieurs avec la sémantique 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> 

C'est un enfant:

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

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

Maintenant, je crée une instance de Article, ajouter un ArticleRevision à Article.Revisions collection, ensemble ArticleRevision.Article pour référencer l'instance Article et shove à la base de données:

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

Aucune colonne Number insérée.

Comment mapper correctement une collection un-à-plusieurs bidirectionnelle avec la sémantique de liste dans NHibernate?

Répondre

6

De l'NHibernate documentation:

S'il vous plaît noter que NHibernate ne pas soutien un-à-plusieurs bidirectionnelles associations avec une collection indexées (liste, carte ou tableau) comme fin "beaucoup", vous devez utiliser un ensemble ou un mappage de sac .

1

Pour autant que je sache, tous ORM Cadres de l'Etat que lorsque vous avez une relation bidirectionnelle, vous devez définir un côté, dans lequel votre ORM dépendra lorsque la mise à jour de l'état de votre relation bidirectionnelle . Dans le cas contraire, vous pouvez obtenir des effets secondaires tels que

  • cartographie Incohérence
  • Violation des contraintes
  • Parmi les autres étoffes

Dans votre cas, la colonne ArticleID peuvent être gérés par les deux extrémités de la relation. À cause de cela, vous devez marquer un côté comme inverse = "true", qui devrait être placé dans le côté de nombreux lorsque vous avez une relation @OneToMany.

Cependant, vous pouvez obtenir le même comportement en désactivant le ArticleRevision.Article de la propriété, en définissant sa cartographie comme

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

aide insert = "false" update = "false", vous dites: NHibernate, ne se soucie pas de moi, dans lequel, par conséquent, NHibenate vous l'ignorez simplement. Maintenant, ignorez inverse = "false" dans la propriété Article.Revisions, et vous obtiendrez votre réponse.

MISE À JOUR:

Retirer not-null = "true" de votre colonne clé, car il est mis à jour juste après ArticleRevision. En conséquence, vous obtiendrez une violation de contrainte dans le cas contraire.

Questions connexes