为什么一对多在NHibernate中无法正常工作?

时间:2010-09-27 20:50:53

标签: c# .net nhibernate nhibernate-mapping

我的情况非常简单,实际上并不知道为什么这不起作用。

这是我的架构:

**[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);

应该足够了。

我做错了什么或者这简直是不可能的?提前感谢您的答案:)

1 个答案:

答案 0 :(得分:1)

您必须设置v.Item,因为ItemVersions为inverse。这意味着“另一方”(多对一)负责维持这种关系。

这是标准做法;为了方便使用,只需在Item中添加一个方法:

public void AddItemVersion(ItemVersion itemVersion)
{
    ItemVersions.Add(itemVersion);
    itemVersion.Item = this;
}