Установите cascade="save-update"
на вашем bag name="CountryList"
. Если это не сработает, может быть полезно опубликовать свой код для CountryManager.Add()
, чтобы увидеть, как происходит сохранение.
В ответ на ваш второй вопрос, если я правильно понял, вот как NHibernate относится к отображенным коллекциям:
Вы отобразили коллекцию как ленивую, поэтому при загрузке объекта не загрузит все элементы коллекции одновременно. Вместо этого при первом доступе к коллекции NHibernate запросит базу данных, чтобы заполнить коллекцию и вернуть ее. Итак, когда вы впервые делаете что-то вроде:
var countries = currency.CountryList;
или
foreach (Country country in currency.CountryList)
NHibernate автоматически выполнит запрос, подобный следующему:
SELECT * FROM country WHERE currency_id = ?
А затем создайте коллекцию объектов Country для возврата (и кэшируйте, чтобы запрос больше не запускался).
По сути, с помощью файла сопоставления вы уже рассказали NHibernate обо всех ваших сущностях (Страна и Валюта) и о том, как они связаны, чтобы он знал, как создавать запросы для доступа к данным. Точно так же он отслеживает то, что было в коллекции, поэтому при добавлении или удалении элементов он может сравнивать то, что было изменено, и выполнять соответствующие операторы INSERT или REMOVE.
Таким образом, способ использования коллекций, отображаемых с помощью NHibernate, состоит в том, чтобы использовать их так же, как и в обычной коллекции .NET. Добавить и удалить элементы по вашему желанию. Как только вы закончите, убедитесь, что вы сказали NHibernate, чтобы сохранить изменения, внесенные в базу данных, вызвав session.Save()
или session.Delete()
для каждого добавляемого / удаляемого элемента или (если вы установили каскадирование, как вы сделали) простой вызов session.Save()
для родительского объекта, который содержит коллекцию.