2009-11-12 4 views

Répondre

5

vieux ... mais après au cas où quelqu'un arrive d'autre ici à la recherche de la réponse:

Vous devez ajouter .AsSet() à la définition de mappage HasManyToMany.


à savoir

mapping.HasManyToMany(x => x.Users) 
     .WithTableName("MessageReceivers") 
     .WithParentKeyColumn("UserId") 
     .WithChildKeyColumn("AdvanceMessageId") 
     .Inverse().AsSet(); 

Cette configuration d'une volonté de contrainte de clé primaire unique, composite sur la table de lien qui utilise les deux colonnes. Le côté négatif est AsSet() ne peut pas être utilisé avec les propriétés de collection de type IList, donc non pour les boucles sans conversion. J'ai utilisé ICollection et les instanciez comme HashSet pour mes applications et cela fonctionne bien.


Plus d'informations sur la gestion de collection avec Fluent NHibernate:

Liste: collection ordonnée d'entités, Dupliquer a permis. Utilisez un .net IList dans le code. La colonne d'index devra être mappée dans NHibernate.

Ensemble: collection non ordonnée d'entités uniques, les doublons ne sont pas autorisés. Utilisez Iesi.Collection.ISet dans le code. Il est important de remplacer GetHashCode et Equals pour indiquer la définition métier de duplicate. Peut être trié en définissant un orderby ou en définissant un comparateur donnant un résultat SortedSet.

Sac: liste non triée d'entités, doublons autorisés. Utilisez un .net IList dans le code. La colonne d'index de la liste n'est pas mappée et n'est pas honorée par NHibernate.

+0

Informations très précieuses; Merci d'avoir partagé. – contactmatt

2

vous devez également la carte du côté inverse de la relation comme

mapping.HasManyToMany(x => x.Users) 
     .WithTableName("MessageReceivers") 
     .WithParentKeyColumn("UserId") 
     .WithChildKeyColumn("AdvanceMessageId") 
     .Inverse(); 

Dans le plus récent Fluent NHibernate vous voulez doivent changer

  • WithTableName -> Tableau

  • WithParentKeyColumn -> ParentKeyColumn

  • WithChildKeyColumn -> ChildKeyColumn

Questions connexes