2008-11-03 2 views
3

У меня есть таблица Продукт и у меня есть таблица StorageHistory.Создание объекта NHibernate и инициализация набора

Теперь продукт содержит ссылку на StorageHistory в его отображении

<set name="StorageHistories" lazy="false"> 
    <key column="ProductId" /> 
    <one-to-many class="StorageHistory" /> 
</set> 

И это работает, когда я получить объект из ОРМА я получаю пустую Исеть.

Что дает мне головная боль, так это, как построить объект в первую очередь. Когда я делаю следующее:

var product = new Product(); 
session.Save(product); 

в product.StorageHistories свойство NULL, и я получаю NullReferenceException. Итак, как мне добавить элементы в эту коллекцию, или я должен пойти, чтобы добавить элементы StorageHistory непосредственно в БД?

ответ

6

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

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

В этом случае используется прецедент сохранения(). Загрузка()/Get() etc usecase покрывается NHibernate, как вы заявили.

+0

Хмм .. это приводит к проблеме, что я буду называть виртуального члена из конструктора. Что может вызвать проблемы: http://blogs.msdn.com/brada/archive/2004/08/12/213951.aspx – Tigraine

+0

Лишает меня проблему, которая мне нужна для постоянной * StorageHistory *, прежде чем я действительно сохраню * Продукт * , что приводит к проблеме, что * StorageHistory * имеет Fk to * Product *, который не может быть нулевым. Поэтому мне придется перенести Продукт, сохранить Storagehistory, обновить Продукт, чтобы вставить продукт w. история. – Tigraine

+0

переключите ассоциацию. Так вы можете сделать: history.Product = продукт. session.Save (история); session.Refresh (product); – Quibblesome

0

Почему нет?

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

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

Смежные вопросы