为什么NHibernate组件的集合会在父更新中被删除?

时间:2012-01-31 16:10:16

标签: nhibernate orm

我在保存nhibernate映射对象时遇到问题 - 它不会在更新时正确保存它的集合,它会删除当前值。插入工作正常。

所以我有一个带有集合的对象:

public class ObjectClass
{
    public virtual Iesi.Collections.Generic.ISet<ActionWithValue> ActionsWithValue { get; set; 
}

并且集合本身是:

public class ActionWithValue
{
    public ActionClass Action { get; set; }
    public decimal Value { get; set; }

    public override bool Equals(object obj)
    {
        return this.Equals(obj as ActionWithValue);
    }

    public virtual bool Equals(PostupakOporabeSaKolicinom other)
    {
        if (other == null)
        {
            return false;
        }
        return this.Action == other.Action && this.Value == other.Value;
    }

    public override int GetHashCode()
    {
        int actionId = (int)Action; // its an enum...
        return (actionId.ToString() + "-" + Value.ToString()).GetHashCode();
    }
}

所以我的工作是让ActionWithValue成为NHibernate中的组件集合,应该很简单:

  <set name="ActionWithValue" table="ActionWithValues" cascade="all-delete-orphan" >
    <key>
      <column name="Id1"/>
      <column name="Id2" />
    </key>
    <composite-element class="MyWebApp.ActionWithValue, MyWebApp">
      <property name="Action" column="Action" type="NHibernate.Type.EnumStringType`1[[MyWebApp.Action, MyWebApp]]" />
      <property name="Value"/>
    </composite-element>
  </set>

我在保存ObjectClass对象时遇到问题 - 它不会在更新时正确保存集合。

  1. 列表项如果我创建新对象并将东西放入集合中,它将保存好。

  2. 如果我编辑对象并将新内容放入集合中,新内容将保存好。

  3. 如果我编辑对象,则集合中的项目将被删除。为什么呢?

  4. 感谢您对此的支持,我真的很感激。

    编辑:执行保存的代码:

    var success = objectClassRepository.Save(objectInstance);
    
    public virtual bool Save(T entity)
    {
        var session = SessionProvider.GetRequestSession(this.DatabaseName);
        using (var transaction = session.BeginTransaction())
        {
            try
            {
                session.SaveOrUpdate(entity);
                transaction.Commit();
            }
            catch (Exception ex)
            {
                if (transaction.IsActive)
                {
                    transaction.Rollback();            
                }
                session.Close();
                return false;
            }
        }
    
        return true;
    }
    

0 个答案:

没有答案