Создание объекта NHibernate и инициализация набора - PullRequest
3 голосов
/ 03 ноября 2008

У меня есть таблица с именем 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 в БД?

Ответы [ 2 ]

6 голосов
/ 03 ноября 2008

Я всегда делаю следующее в ctor родительского объекта:

историй = новый HashedSet ();

Это относится к случаю использования Save (). Как вы указали, сценарий использования Load () / Get () и т. Д. Распространяется на NHibernate.

0 голосов
/ 06 ноября 2008

Почему бы и нет?

private ISet _StorageHistories;
public virtual ISet StorageHistories {
     protected set { _StorageHistories = value;}
     get { if (_StorageHistories == null) _StorageHistories = new HashSet();
           return _StorageHistories;
     }
}

Конечно, если у вас все равно есть проблемы с частным доступом, вы можете поместить его в конструктор.

...