nhibernate: Почему моя сущность не загружается в кеш первого уровня? - PullRequest
1 голос
/ 18 января 2010

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

Тест:

        using (new TransactionScope())
        {
            // arrange
            NewSessionUnitOfWorkFactory factory = CreateUnitOfWorkFactory();
            const int WorkItemId = 1;
            const string OriginalDescription = "A";

            WorkItemRepository repository = new WorkItemRepository(factory);
            WorkItem workItem = WorkItem.Create(WorkItemId, OriginalDescription);
            repository.Commit(workItem);

            // act

            using (IUnitOfWork uow = factory.Create())
            {
                workItem = repository.Get(WorkItemId);
                WorkItem secondInstance = repository.Get(WorkItemId);

                // assert
                Assert.AreSame(workItem, secondInstance);
            }
        }

Обновление

Причиной такого странного поведения была строка кода:

            NewSessionUnitOfWorkFactory factory = CreateUnitOfWorkFactory();

Когда я заменил его на этот заводской импл:

            ExistingSessionAwareUnitOfWorkFactory factory = new ExistingSessionAwareUnitOfWorkFactory(CreateUnitOfWorkFactory(), new NonTransactionalChildUnitOfWorkFactory());

Работает как положено.

1 Ответ

2 голосов
/ 18 января 2010

Я просто предполагаю, что вы не включили код для своих реализаций Repository / UnitOfWork. Читая этот фрагмент кода, как ваш репозиторий узнает, с каким UnitOfWork он должен работать?

Кэш первого уровня находится на уровне сеанса, который, как я предполагаю, содержится в вашем IUnitOfWork. Единственным параметром в репозитории является Factory, поэтому мое следующее предположение состоит в том, что код для repository.Get () создает новый сеанс и загружает через него объект. Поэтому следующий вызов Get () создаст экземпляр другого нового сеанса и загрузит объект. Два разных кеша уровня 1, извлечены два разных объекта.

Конечно, если ваш UnitOfWork фактически инкапсулирует Transaction, а Factory инкапсулирует Session, то это на самом деле не применимо:)

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