Impossible de convertir l’object de type ‘NHibernate.Collection.Generic.PersistentGenericBag’

public List FindAll() { using (ISession NSession = SessionProvider.GetSession()) { ICriteria CriteriaQuery = NSession.CreateCriteria(typeof(Application)); return (List) CriteriaQuery.List(); } } 

Je reçois une exception dans laquelle la classe d’application est la suivante:

 public class Application { private ssortingng _name; private Developer _developer; private int _id; private List _bugs; public Application() { } public virtual int ApplicationId { get { return _id; } set { _id = value; } } public virtual Developer Developer { get { return _developer; } set { _developer = value; } } public virtual ssortingng Name { get { return _name; } set { _name = value; } } public virtual List Bugs { get { return _bugs; } set { _bugs = value; } } } 

System.InvalidCastException: impossible de 1[BugTracker.Model.Bug]' to type 'System.Collections.Generic.List object de type ‘NHibernate.Collection.Generic.PersistentGenericBag 1[BugTracker.Model.Bug]' to type 'System.Collections.Generic.List 1 [BugTracker.Model.Bug]’.

Voici l’application.hbm.xml:

                 

Je suis novice à Nhibernate et le trouve très compliqué. Je ne peux vraiment pas voir le problème. L’exception se produit à la dernière ligne du constructeur de la classe d’application.

Essayez de définir votre propriété Bugs comme IList. Vous devez le rendre générique. Cordialement.

La méthode List<>() ne renvoie pas de List , vous ne pouvez donc pas la convertir en List .

Au lieu de cela, vous devez appeler ToList() pour copier dans une List() . (après quoi vous n’aurez pas besoin d’un casting)

Vous devez lancer un IList. Nhiberante utilise Dependency Injection et vous devez utiliser des interfaces pour lui permettre de faire sa magie.

Je vous dirai une autre fois que cela arrive, la plupart ne sont pas au courant. Si vous avez deux colonnes revenant avec le même nom mais d’un type différent, vous rencontrerez ce problème. Par exemple, supposons que vous fassiez une jointure basée sur un identifiant et que votre jeu de résultats ressemble à

 Id, Name, CreatedDate, Id, ExpirationDate 

si le type de données de la première colonne Id est uniqueidentifier et que le type de données de la deuxième colonne id est int, vous obtiendrez

 Input ssortingng 'f49f503d-70d5-4fbb-8aa2-a0bd0113ff4d' was not in the correct format. ----> System.InvalidCastException : Unable to cast object of type 'System.Guid' to type 'System.IConvertible'. 

car NHibernate mélangera les deux colonnes car elles portent le même nom / la même clé. Pour résoudre ce problème, donnez à vos colonnes des noms uniques via un alias:

 select Id as IDOne, Name, CreatedDate, Id as IDTwo, ExpirationDate from Table1 t join Table2 t2 on t.Name = t2.Name 

et cela devrait résoudre les problèmes que vous avez avec la méthode .List ().

REMARQUE: List () ne doit pas être confondu avec List dans NHibernate. L’un est fortement typé et l’autre, bien sûr, ne l’est pas. List parsingra également automatiquement le jeu de résultats pour vous plutôt que de vous redonner une IList faiblement typée. Dans mon cas, j’utilise tout simplement l’ancienne liste ().

Changez votre code comme:

 public virtual IList Bugs { get { return _bugs; } set { _bugs = value; } } 

Notez que Bugs est un IList au lieu de List .