Почему один-ко-многим не работает должным образом в NHibernate? - PullRequest
0 голосов
/ 28 сентября 2010

У меня очень простая ситуация, и я действительно не понимаю, почему это не работает.

Это моя схема:

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

1 Ответ

1 голос
/ 28 сентября 2010

Вы должны установить v.Item, потому что ItemVersions равен inverse. Это означает, что «другая сторона» (многие-к-одному) отвечает за поддержание отношений.

Это стандартная практика; чтобы упростить использование, просто добавьте метод в Item:

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