J'ai un objet d'entité appelé i Maintenant, je veux mapper cela dans NHibernate, donc j'ai créé: p> Je reçois une exception: p> Impossible de lancer l'objet de type 'Nhibernate.Collection.PersistTenlist' Pour taper "... VisitsCollection ' P>
blockQuote> Chaque fois que j'accède à la propriété des visites. P> J'ai également essayé de la mapper de cette façon: p> mais Néanmoins, je reçois cette exception: P> Type personnalisé ne met pas en œuvre UserCollectionType: ..... VisitsCollection P>
blockQquote> Je ne veux pas hériter de mon Des idées sur la maquette pour la cartographie, préservant la structure de mon code? P> Merci d'avance. P> < / p> patient CODE> et cette entité a une propriété appelée
visites code> de type
visitescollection code>.
VisitsCollections Code> est une classe enfant de
IList
visitesCollection code> 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). P>
3 Réponses :
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. p>
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 ... p>
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? p>
Vérifiez également ce SO TRUEIL . P>
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>
juste pour référence, voici comment vous pouvez le faire en utilisant si nous devrions ou non créer un type de collecte personnalisé est un sujet séparé IMHO P> fluentnibernate code>
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
});
}
}