Невозможно привести объект типа 'NHibernate.Collection.Generic.PersistentGenericBag' - PullRequest
5 голосов
/ 24 июля 2011
public List<Application> FindAll()
{
    using (ISession NSession = SessionProvider.GetSession())
    {
        ICriteria CriteriaQuery =
            NSession.CreateCriteria(typeof(Application));

        return (List<Application>) CriteriaQuery.List<Application>();

    }
}

Я получаю исключение, в котором класс приложения следующий:

public class Application
{
     private string _name;
     private Developer _developer;
     private int _id;
     private List<Bug> _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 string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public virtual List<Bug> Bugs
    {
        get { return _bugs; }
        set { _bugs = value; }
    }
}

System.

Вот файл application.hbm.xml:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="BugTracker.Model"
                   assembly="BugTracker">
  <class name="Application" table="Applications" lazy="false">
    <id name="ApplicationId" column ="ApplicationId" type="int" unsaved-value ="0">
      <generator class ="native"></generator>
    </id>

    <property name ="Name" column="Name"/>

    <component access ="field.camelcase-underscore" name ="Developer"
               class="Developer">
      <property access ="field.camelcase-underscore" 
                column ="DeveloperFirstName" name="FirstName"/>
      <property access ="field.camelcase-underscore" 
                column="DeveloperLastName" name="LastName"/>
    </component>

    <bag cascade="all-delete-orphan"
          inverse ="true"
          name ="Bugs"
          lazy="false"
          access ="field.camelcase-underscore">
      <key column ="ApplicationId"/>
      <one-to-many class ="Bug"/>
    </bag>

  </class>
</hibernate-mapping>

Я новичок в Nhibernate и нахожу это очень сложным. Я действительно не вижу проблемы. Исключение возникает в последней строке конструктора класса приложений.

Ответы [ 5 ]

7 голосов
/ 19 октября 2011

Попробуйте установить свойство Bugs как IList.Вы должны сделать это общим.С уважением.

3 голосов
/ 20 октября 2011

Вам нужно привести к IList. Nhiberante использует Dependency Injection, и вам нужно использовать интерфейсы, чтобы позволить ему творить чудеса.

3 голосов
/ 24 июля 2011

Метод List<>() не возвращает List<T>, поэтому вы не можете привести его к List<T>.

Вместо этого вы должны вызвать ToList() для копирования в List<Application>(),(после чего вам не понадобится приведение)

2 голосов
/ 31 августа 2012

Я скажу вам в другой раз, когда это случается, о чем большинство не знают.Если у вас есть два столбца с одинаковым именем, но другого типа, вы столкнетесь с этой проблемой.Например, предположим, что вы выполняете объединение на основе некоторого идентификатора, и ваш результирующий набор выглядит как

Id, Name, CreatedDate, Id, ExpirationDate

, если тип данных первого столбца идентификатора - уникальный идентификатор, а тип данных второго столбца идентификатора -int, вы получите

Input string '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'.

, потому что NHibernate будет смешивать два столбца, поскольку они имеют одинаковое имя / ключ.Чтобы решить эту проблему, просто присвойте своим столбцам уникальные имена через псевдоним:

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

, и это должно решить любые проблемы, которые у вас возникли с методом .List ().

ПРИМЕЧАНИЕ: Список () не следует путать со списком в NHibernate.Один строго типизирован, а другой, конечно, нет.Список также будет автоматически анализировать набор результатов для вас, вместо того, чтобы возвращать вам слабо типизированный IList.В моем случае я использую просто старый List ().

1 голос
/ 20 января 2013

Измените свой код следующим образом:

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

Обратите внимание, что Bugs это IList<Bug> вместо List<Bug>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...