父 - NHibernate中的子关系

时间:2010-07-09 13:58:59

标签: nhibernate session fluent-nhibernate

我希望能够创建一个带子节点的父对象,让父节点处理更新,保存和删除。

我的地图课程。

ParentMap

    Id(x => x.Id, "ID").GeneratedBy.Identity();
        Map(x => x.Name);                

        HasMany(x => x.Children)
            .KeyColumn("ParentID")
            .Inverse()
            .Cascade
            .AllDeleteOrphan()
            .AsBag();

ChildMap

Id(x => x.Id, "ID").GeneratedBy.Identity();
Map(x => x.Name);            
Map(x => x.Value);            
References(x => x.Parent);

这是代码。

回发后,我创建了一个带有子项的新父级。问题是它不会删除子项,但其他一切工作正常更新和保存。

var parent = new Parent();
parent.Id = _view.parentID;
parent.Name = _view.Name;
parent.Children = _view.Children; 

我也尝试了下面的代码,但这会返回一个非唯一的错误。

var parent = repository.Get(_view.parentID);
parent.Name = _view.Name;
parent.Chidlren = _view.Children;

有人能告诉我在NHibernate中处理这个问题的最佳方法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

您无法使用NHibernate重新分配子集合。 NHibernate基本上“观察”子集合的变化,以便它知道如何处理对数据库的保存。如果重新分配子集合,NHibernate将丢失该引用,并且无法再跟踪更改。要解决此问题,您必须修改子集合,但不能重新分配它。

我通常如何确保这是我使用私人设定器进行只读。然后我将方法添加到父类以根据需要修改列表。

private IList<ChildRecord> theChildCollection = new List<ChildRecord>();
/// <summary>
/// The collection of child records.
/// </summary>
public virtual IList<ChildRecord> Children
{
   get
   {
      return theChildCollection.ToList().AsReadOnly();
   }
   private set
   {
      theChildCollection = value;
   }
}

/// <summary>
/// Adds a record to the child collection.
/// </summary>
public void Add(ChildRecord aRecord)
{
   theChildCollection.Add(aRecord);
}

/// <summary>
/// Removes a record from the child collection.
/// </summary>
public void Delete(ChildRecord aRecord)
{
   theChildCollection.Remove(aRecord);
}

答案 1 :(得分:0)

首先尝试清除儿童系列:

var parent = new Parent();
parent.Id = _view.parentID;
parent.Name = _view.Name;
parent.Children.Clear();
parent.Children = _view.Children;

我不确定重新分配收藏品是一种很好的做法。我建议清除集合,然后循环遍历_view.Children并添加每个子节点。更好的是,使用IEnumerable Except扩展方法来确定需要添加或删除哪些子项并单独处理它们。