2010-10-26 3 views
1

J'ai une classe qui utilise un IPlacez comme type de collection comme ci-dessous:NHibernate: utilisation de IEnumerable que les résultats de type collection en erreur

public class Client 
    { 
    private ISet<Contact> _contacts = new HashedSet<Contact>(); 
    public virtual ISet<Contact> Contacts { get { return _contacts; } } 
    } 

Je ne veux pas que la collection elle-même pour pouvoir être modifié extérieurement. Cependant, si je change le type de la propriété à IEnumerable comme ci-dessous:

public class Client 
    { 
    private ISet<Contact> _contacts = new HashedSet<Contact>(); 
    public virtual IEnumerable<Contact> Contacts { get { return _contacts; } } 
    } 

Alors chaque fois que j'essaie d'utiliser cette classe je reçois l'erreur NHibernate:

System.InvalidCastException: Impossible de jeter l'objet de type « NHibernate .Collection.Generic.PersistentGenericBag 1[Kctc.BusinessLayer.ProbateAssist.Entities.Contact]' to type 'Iesi.Collections.Generic.ISet 1 [Kctc.BusinessLayer.ProbateAssist.Entities.Contact] '.

Ce qui donne? Comment puis-je lire la version publique de la collection uniquement?

NB J'ai également essayé d'utiliser ReadOnlyCollection, et d'obtenir la même erreur.

+1

Vous devriez montrer à quoi ressemblent vos fichiers de configuration nhibernate (ou quelle est votre configuration courante si vous utilisez FluentNhibernate) – samy

Répondre

1

Vous utilisez probablement le mappage automatique Fluent, qui consiste à deviner le type comme sac au lieu de définir en fonction du type d'interface. Vous devrez le remplacer dans ce cas.

IEnumerable<T> Fonctionne correctement lors du mappage manuel ou XML.

+0

Brilliant! Je n'aurais jamais deviné que c'était un problème de cartographie. Je vous remercie. – David

+0

Pour la postérité, j'ai corrigé ce problème en ajoutant. AsSet() à la fin de la ligne HasMany pour la collection Contacts dans le fichier de mappage client. – David

Questions connexes