8
votes

Nibernate Type de collecte personnalisée

J'ai un objet d'entité appelé patient et cette entité a une propriété appelée visites de type visitescollection .

VisitsCollections est une classe enfant de IList mais ajoute également une logique personnalisée à la collection (comme commande automatique, une validation, des notifications, etc.).

i Besoin Pour utiliser le type de collecte personnalisé car il ajoute des données aux entités ajoutées à la collection et effectue des documents de manière transparente de manière transparente.

Maintenant, je veux mapper cela dans NHibernate, donc j'ai créé: xxx

Je reçois une exception:

Impossible de lancer l'objet de type 'Nhibernate.Collection.PersistTenlist' Pour taper "... VisitsCollection '

Chaque fois que j'accède à la propriété des visites.

J'ai également essayé de la mapper de cette façon: xxx

mais Néanmoins, je reçois cette exception:

Type personnalisé ne met pas en œuvre UserCollectionType: ..... VisitsCollection

Je ne veux pas hériter de mon visitesCollection de n'importe quel type de NHibernate, car la classe de collecte fait partie d'un cadre que je veux que ce soit dal-agnostique (comme il sera Utilisé dans de nombreux scénarios - non seulement avec une base de données).

Des idées sur la maquette pour la cartographie, préservant la structure de mon code?

Merci d'avance. < / p>


0 commentaires

3 Réponses :


7
votes

Je n'utilise jamais de types de collecte personnalisés, principalement parce que je suis paresseux. NHibernate veut que vous utilisiez un iusercollectiontype je crois, ce qui nécessite un peu de plomberie.

plutôt que cela, mon premier arrêt serait de regarder en utilisant des méthodes d'extension comme Discuté par Billly McCafferty . Mais vous avez du code écrit de sorte que ...

Alternativement, vous pouvez mapper votre collection en tant que composant comme discuté ici par Colin Jack . Cela pourrait être plus facile pour votre scénario?

Vérifiez également ce SO TRUEIL .


0 commentaires

1
votes

Je vote également pour ne pas utiliser de collections personnalisées. Quoi qu'il en soit, vous pouvez le faire via un composant.

<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>


0 commentaires

0
votes

juste pour référence, voici comment vous pouvez le faire en utilisant fluentnibernate code>

si nous devrions ou non créer un type de collecte personnalisé est un sujet séparé IMHO P>

public class PatientOverride : IAutoMappingOverride<Patient>
{
        public void Override(AutoMapping<Patient> mapping)
        {
             mapping.Component(
                x => x.Visits,
                part =>
                {
                    part.HasMany(Reveal.Member<VisitsCollection, IEnumerable<Visit>>("backingFieldName")) // this is the backing field name for collection inside the VisitsCollection class
                    .KeyColumn("PatientId")
                    .Inverse(); // depends on your use case whether you need it or not
                });
        }
}


0 commentaires