2

J'essaye de mapper la collection pendant deux jours sans succès. Je lis aussi tous les articles et les forums possibles mais toujours là-bas. Ok, voici le problème:Comment mapper la collection personnalisée de NHibernate avec fluentNHibernate?

1) La classe de collection contient un champ privé "_internalCollection" qui est mappé avec NHib.

2) L'entité de dépôt doit exposer la propriété de lecture en lecture seule.

3) Je veux éviter l'implémentation de l'interface NHibernate IUserCollectionType !!! Je l'ai fait avec le mappage XML et cela fonctionne très bien. Le WarehouseEntity est un objet de collection. Warehouses est une propriété readonly dans la classe OrgEntity.

<component name="Warehouses" class="Core.Domain.Collections.EntitySet`1[Core.Domain.OrgStructure.IWarehouseEntity,Core],Core"> 
    <set name="_internalCollection" table="`WAREHOUSE`" cascade="save-update" access="field" generic="true" lazy="true" > 
     <key column="`WarehouseOrgId`" foreign-key="FK_OrgWarehouse" /> 
     <!--This is used to set the type of the collection items--> 
     <one-to-many class="Domain.Model.OrgStructure.WarehouseEntity,Domain"/> 
    </set> 
    </component> 

Une idée comment puis-je le faire avec NHibernate fluide?

EDIT: Core.Domain.Collections.EntitySet`1 est la classe de collection de base. Il fournit des fonctionnalités de base pour travailler avec des collections et peut s'adapter à n'importe quelle classe qui est l'interface IEntity.

Répondre

3

Essayez:

HasMany(x => x.Warehouses) 
    .AsSet().KeyColumn("WarehouseOrgId") 
    .Access.CamelCaseField(Prefix.Underscore) 
    .ForeignKeyConstraintName("FK_OrgWarehouse"); 

Edit: J'ai raté une partie clé de la question voici donc un autre essai:

Component(x => x.Warehouses, m => 
    { 
     m.HasMany<Warehouse>(Reveal.Member<EntitySet<IWarehouseEntity>>("_internalCollection") 
      .AsSet().KeyColumn("WarehouseOrgId") 
      .ForeignKeyConstraintName("FK_OrgWarehouse"); 
    }); 

Je suis sûr que ce n'est pas, mais nous espérons qu'il vous met à droite chemin. Jetez également un oeil en utilisant ComponentMap.

Mon conseil est d'éviter complètement les collections personnalisées. J'ai remplacé tous les nôtres par des méthodes d'extension sur IEnumerable<T>.

+0

Cela ne fonctionnera pas. Le nom de la propriété n'est pas mentionné ici. Comment Fluent cartographiera le terrain? Warehouses n'est pas de type ISet mais EntitySet <>. – mynkow

+0

Je pense que cela va fonctionner. Avoir à exécuter tous les tests et voir c'est mais la classe Reveal était ce que je cherchais ... 10x Composant > (x => x.Departments, m => { m.HasMany (Reveal.Member > ("_internalCollection")) .Access.Field() .KeyColumn ("DepartmentOrgId") .ForeignKeyConstraintName ("FK_OrgDepartment") .AsSet(); }); – mynkow

+0

Une question. Pouvez-vous utiliser IEnumerable et les méthodes d'extension + en ajoutant une propriété SelectedItem et ce SelItem à mapper avec NHibernate. Si c'est possible je prendrai votre avis ... – mynkow

Questions connexes