我的情况非常简单,实际上并不知道为什么这不起作用。
这是我的架构:
**[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不能为null。因此,item_id属性不会由Itemerers对象中的NHibernate自动设置。为什么cascade =“save-update”和inverse =“true”在这种情况下不起作用?
当我手动设置时,通过添加以下代码:
v.Item = item;
并且调用save,一切正常,但这不是我从NHibernate中调用的 - 调用
item.ItemVersions.Add(v);
应该足够了。
我做错了什么或者这简直是不可能的?提前感谢您的答案:)
答案 0 :(得分:1)
您必须设置v.Item,因为ItemVersions为inverse
。这意味着“另一方”(多对一)负责维持这种关系。
这是标准做法;为了方便使用,只需在Item中添加一个方法:
public void AddItemVersion(ItemVersion itemVersion)
{
ItemVersions.Add(itemVersion);
itemVersion.Item = this;
}