NHibernate нужна загрузка здесь? - PullRequest
1 голос
/ 19 марта 2012

У меня проблемы с использованием NHibernate (Версия 3.2, с Visual Studio 2010).

Я пытаюсь загрузить задачи на странице.Задание прикрепляется к сотруднику (по внешнему ключу).

класс:

public class Task
{                                   
    private Employee employee;

    public virtual Employee Employee
    {
        get
        {
            return employee;
        }

        set
        {
            employee = value;
        }
    }
}

Метод репозитория:

public List<Task> GetAll()
    {
        using (ISession session = Configuration.SessionProvider.OpenSession())
        {
            var tasks = session
                .CreateCriteria(typeof(Task))
                .List<Task>()
                .ToList();

            return tasks;
        }
    }

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

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Test1.Domain.Model" assembly="Test1.Domain">
<class name="Task" table="Task">
    <id name="Id" column="TaskId">
        <generator class="identity"/>
    </id>

    <many-to-one name="Employee" class="Employee" column="EmployeeId"/>

</class>

страница:

<asp:GridView runat="server" ID="taskGrid" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField DataField="Id" HeaderText="Task ID" />
            <asp:BoundField DataField="Employee" HeaderText="Employee" />
        </Columns>
    </asp:GridView>

taskGrid.DataSource = taskRepository.GetAll();
taskGrid.DataBind();

Всякий раз, когда я открываю страницу в браузере, появляется сообщение об ошибке:

Initializing[Test1.Domain.Model.Employee#1]-Could not initialize proxy - no Session.

, поскольку для свойства employee для задач задан прокси-сервер.

То же самое с шагом отладки (F10).Но когда я вхожу в метод GetAll () (F11), сотрудники задач полностью загружаются (без прокси-сервера).

Я запутался, почему NHibernate по-разному реагирует на разные методы отладки.Меня больше всего интересует

  1. Нужна ли мне энергичная загрузка в моем случае?
  2. Почему загрузка связанных сущностей зависит от способа отладки NHibernate?

1 Ответ

2 голосов
/ 19 марта 2012

Вы можете использовать QueryOver для этого:

Session.QueryOver<Task>()
 .Fetch(task => task.Employee).Eager
 .TransformUsing(Transformers.DistinctRootEntity)
 .List<Task>();

В этом запросе получаются все задачи с реальными объектами сотрудника (не с прокси)

...