Когда вы вызываете Repository.Save, вы уведомляете сеанс, который хранится в хранилище, чтобы отслеживать этот объект и синхронизировать изменения в базе данных при следующей очистке. Пока вы не очистите сеанс, в базу данных не вносятся никакие изменения. Однако объект становится частью кэша сеанса и поэтому будет возвращен функцией Get (1).
Когда вы запускаете запрос для заполнения коллекции, сеанс запрашивает базу данных, чтобы получить результаты, если она еще не кэшировала эти результаты. Поскольку вы еще не обновили базу данных, машина, которую вы добавили в сеанс, не будет частью набора результатов. (<- возможно, неверно) Если я правильно читаю документацию, оба результата запроса и объекты Save () ed должны быть добавлены в кэш сеанса (первого уровня). Это не обязательно означает, что <code>querystatement.List() запрашивает кеш после добавления результатов в БД ... Мне трудно с трудом сосредоточиться на том, что происходит.
Кроме того, я считаю, что вы можете установить автоматическую очистку сеанса, но мне придется проверить документацию.
ОБНОВЛЕНИЕ:
Думаю, я смогу увидеть, что здесь происходит. Сеанс по умолчанию FlushMode
равен Auto
, но Rhino UnitOfWork.Start()
создает сеанс с FlushMode
, установленным на Commit
, что означает, что сеанс не будет автоматически сбрасываться, если вы явно не вызовете Flush()
или не совершите транзакцию. При FlushMode
, равном Auto
, NHibernate будет (иногда?) Сбрасывать сеанс перед выполнением запросов, чтобы предотвратить возврат устаревших данных. Если я прав, ваша транзакция с БД выглядит примерно так:
SELECT * FROM Car
INSERT INTO Car (...) VALUES (...)
Когда автоматические сбросы кажутся немного двусмысленными из документации / блогов, которые я читал ... самый распространенный ответ - это то, что при FlushMode = Auto
он сбрасывает «иногда», хотя гарантирует, что Session.Find
никогда не вернет устаревшие данные. Поскольку NHibernate Linq на самом деле просто создает запрос Criteria, он может не вызывать автоматическую очистку (возможно, это было исправлено сейчас ... это трудно понять).
Так что мне кажется, что в вашем случае вы хотите сбросить после сохранения, потому что вы сразу же хотите получить результаты своего сохранения. В меньших единицах работы, где вы обновляете только сущности, будет достаточно одного Commit (). Возможно, UnitOfWork.CurrentSession.FlushMode = FlushMode.Auto;
справится с задачей, но тот факт, что фабрика UOW явно устанавливает режим Commit, побуждает вас по-настоящему задумываться о границах UOW.