C # NHibernate - Ошибка доступа к списку элементов (не удалось лениво инициализировать ...) - PullRequest
0 голосов
/ 08 ноября 2011

Я использую MVC2, NHibernate 3.2.

Мои занятия:

public class NHibernateHelper
{

    private static ISessionFactory _sessionFactory;

    private static ISessionFactory SessionFactory
    {
        get
        {
            if (_sessionFactory == null)
            {
                var configuration = new Configuration();
                configuration.Configure();
                configuration.AddAssembly(typeof(EstoqueEquipamento).Assembly);
                _sessionFactory = configuration.BuildSessionFactory();
            }
            return _sessionFactory;
        }
    }

    public static ISession OpenSession()
    {
        return SessionFactory.OpenSession();
    }
}

Я запрашиваю элемент следующим образом:

 public Car GetCar(object pk)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            {

                return session.Get<Car>(pk);
            }
        }

Карта автомобиля:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateClasses" namespace="NHibernateClasses.Entities">
    <class name="Car" table="STACK.CAR" lazy="true" dynamic-update="true" dynamic-insert="true" >
        <id name="CarId" column="CAR_ID" type="Int32" unsaved-value="0">
            <generator class="sequence">
                <param name="sequence">SQ_CAR</param>
            </generator>
        </id>
        <bag name="TireList" inverse="true" generic="true" lazy="true" >
            <key>
                <column name="CarId"/>
            </key>
            <one-to-many class="Tire" />
        </bag>




        <property name="Plate" type="String" column="MAH_PLATE" />



    </class>
</hibernate-mapping>

Отображение шин:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateClasses" namespace="NHibernateClasses.Entities">
    <class name="Tire" table="STACK.Tire" lazy="true" dynamic-update="true" dynamic-insert="true" >
        <id name="TireId" column="Tire_ID" type="Int32" unsaved-value="0">
            <generator class="sequence">
                <param name="sequence">SQ_Tire</param>
            </generator>
        </id>


        <property name="Brand" type="String" column="MAH_BRAND" />



    </class>
</hibernate-mapping>

Затем я запрашиваю элемент:

var car = GetCar(1);//works just fine
var tirelist = car.Tires;//throws error!

Первая строка работает без проблем, но последняя строка выдает следующую ошибку:

Инициализация [Автомобиль] -failed лениво инициализировать коллекцию ролей: Car.TireList, ни один сеанс или сеанс не был закрыт

Дайте мне знать, если вам также нужен файл конфигурации.

Спасибо

1 Ответ

3 голосов
/ 08 ноября 2011

В GetCar вы закрываете сеанс (из-за using), прежде чем в дальнейшем получите доступ к коллекции шин в своем коде. Коллекции по умолчанию загружаются в nHibernate, поэтому убедитесь, что вы выбрали коллекцию перед завершением транзакции. Вы можете использовать Eager loading, чтобы убедиться, что nHibernate также загружает дочернюю коллекцию.

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