У меня очень простая ситуация, и я действительно не понимаю, почему это не работает.
Это моя схема:
**[item]**
id (PK)
symbol
**[item_version]**
id (PK)
item_id (FK->ITEM)
symbol
Это мои сопоставления:
item.hbm.xml
<class name="Core.Model.Entities.Item, Core.Model" table="item" lazy="false">
<id name="Id" column="id" type="long">
<generator class="native" />
</id>
<property name="Symbol" column="symbol"/>
<bag name="ItemVersions" lazy="false" table="item_version" inverse="true" cascade="save-update">
<key column="item_id" />
<one-to-many class="Core.Model.Entities.ItemVersion, Core.Model"/>
</bag>
</class>
* item_version.hbm.xml *
<class name="Core.Model.Entities.ItemVersion, Core.Model" table="item_version" lazy="false">
<id name="Id" column="id" type="long">
<generator class="native" />
</id>
<many-to-one name="Item" class="Core.Model.Entities.Item, Core.Model" column="item_id" cascade="save-update"/>
<property name="Symbol" column="symbol"/>
</class>
Это классы:
Item.cs
public class Item : Entity<IItemDao>
{
private long id;
virtual public long Id
{
get { return this.id; }
set { this.id = value; }
}
private string symbol;
virtual public string Symbol
{
get { return this.symbol; }
set { this.symbol = value; }
}
private IList<ItemVersion> item_versions = new List<ItemVersion>();
virtual public IList<ItemVersion> ItemVersions
{
get { return this.item_versions; }
set { this.item_versions = value; }
}
}
ItemVersion.cs
public class ItemVersion : Entity<IItemVersionDao>
{
private long id;
virtual public long Id
{
get { return this.id; }
set { this.id = value; }
}
private Item item = null;
virtual public Item Item
{
get { return this.item; }
set { this.item = value; }
}
private long item_id = 0;
virtual public long ItemId
{
get { return this.item_id; }
set { this.item_id = value; }
}
private string symbol;
virtual public string Symbol
{
get { return this.symbol; }
set { this.symbol = value; }
}
}
А этот код ...
Item item = new Item();
item.Name = "test";
ItemVersion v = new ItemVersion();
v.Symbol = "test version";
item.ItemVersions.Add(v);
Item.Dao.Save(tmp);
... не работает.Он вставляет элемент и выдает исключение при вставке строки item_version, что item_version.item_id не может быть нулевым.Так что свойство item_id не устанавливается автоматически NHibernate в объекте ItemVersion.Почему cascade = "save-update" и inverse = "true" не работают в этом случае?
Когда я устанавливаю вручную, добавив этот код:
v.Item = item;
и чем вызов сохранитьвсе работает нормально, но это не то, что я, кроме NHibernate - достаточно набрать
item.ItemVersions.Add(v);
.
Я что-то не так делаю или это просто невозможно?Заранее спасибо за ответы :) 1047 *