Создание объекта NHibernate и инициализация набора
-
06-07-2019 - |
Вопрос
У меня есть таблица с именем Product , и у меня есть таблица StorageHistory .
Теперь Product содержит ссылку на StorageHistory в своих сопоставлениях
<set name="StorageHistories" lazy="false">
<key column="ProductId" />
<one-to-many class="StorageHistory" />
</set>
И это работает, когда я получаю объект из ORM, я получаю пустой ISet.
Что вызывает у меня головную боль, так это то, как построить объект в первую очередь. Когда я делаю следующее:
var product = new Product();
session.Save(product);
Свойство product.StorageHistories имеет значение NULL, и я получаю исключение NullReferenceException. Итак, как мне добавить элементы в эту коллекцию, или я должен пойти путем добавления самих элементов StorageHistory в БД?
Решение
Я всегда делаю следующее в ctor родительского объекта:
историй = новый HashedSet ();
Это относится к случаю использования Save (). Как вы указали, сценарий использования Load () / Get () и т. Д. Распространяется на NHibernate.
Другие советы
Почему бы и нет?
private ISet _StorageHistories;
public virtual ISet StorageHistories {
protected set { _StorageHistories = value;}
get { if (_StorageHistories == null) _StorageHistories = new HashSet();
return _StorageHistories;
}
}
Конечно, если у вас все равно есть проблемы с личным доступом, вы можете поместить его в конструктор.