NHibernate - незаконный доступ к загрузке коллекции - PullRequest
2 голосов
/ 01 апреля 2011

У меня есть две организации: Клиент и Учетная запись. У Клиента много аккаунтов.

Мое сопоставление для Клиента:

<bag cascade="all" name="Accounts" table ="Accounts" mutable="true" inverse="true">
  <key>
    <column name="Customer_Id" />
  </key>
  <one-to-many class="Account, POCOEntities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>

Мое сопоставление для учетной записи:

<many-to-one cascade="all" class="Customer, POCOEntities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Customer">
  <column name="Customer_Id" />
</many-to-one>

В моем приложении я получаю клиента по его идентификатору:

var customer = _customerRepository.GetById(custID);

Затем я пытаюсь получить учетную запись клиента с:

Account account = customer.Accounts.FirstOrDefault();

Затем я получаю следующее исключение: «NHibernate.LazyInitializationException: незаконный доступ к загрузке коллекции»

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

var acc = from a in _accountRepository.GetAll()
                  where a.Customer.Equals(customer)
                  select a;

Все, что я сделал в предыдущем коде, - это создание переменной, которую я даже не использую. Каким-то образом это вызывает утверждение "Account account = customer.Accounts.FirstOrDefault ();" чтобы добиться успеха, хотя

У кого-нибудь есть идеи, что здесь происходит?

Ответы [ 3 ]

4 голосов
/ 01 апреля 2011

Я думаю, что это довольно просто: у вас больше нет открытой ISession, связанной с сущностью.И я думаю, что это связано с тем, что оставьте управление сеансом (открытие / закрытие сеанса) ответственным за хранилище, и это неправильно.

0 голосов
/ 16 декабря 2011

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

0 голосов
/ 06 апреля 2011

Проблема здесь заключалась в том, что «ISession» был закрыт, хотя это было не из-за того, что он обрабатывался отдельными репозиториями, как предлагалось ранее.

Причиной проблемы было то, что я объявил свой UnitOfWork (ISession) за рамками моего бизнес-метода - PlaceOrder (). Например:

ISession myUnitOfWork = new ISession();


public void PlaceOrder()
{

    var myRepository = new IRepository<Customer>(myUnitOfWork);
    ....
    ....
    Commit();
}

Итак, первый вызов метода PlaceOrder () был в порядке, но при дополнительных вызовах ISession была закрыта, поэтому появилось сообщение «Недопустимый доступ к загрузке коллекции». Решением было объявить ISession в методе PlaceOrder ():

public void PlaceOrder()
{
    ISession myUnitOfWork = new ISession();
    var myRepository = new IRepository<Customer>(myUnitOfWork);
    ....                

В конечном итоге эта проблема возникла в результате непонимания концепции единицы работы. Если мое понимание теперь правильно, то каждый бизнес-метод (такой как PlaceOrder выше) является новой транзакцией и поэтому требует, чтобы ISession открывался в начале и закрывался в конце. Я объявлял ISession вне области действия метода, думая, что его нужно объявить только один раз.

...