NHibernate中的亲子关系

NHibernate中的亲子关系,nhibernate,session,fluent-nhibernate,Nhibernate,Session,Fluent Nhibernate,我希望能够创建一个包含子对象的父对象,并让父对象处理更新、保存和删除 我的地图课 父地图 Id(x => x.Id, "ID").GeneratedBy.Identity(); Map(x => x.Name); HasMany(x => x.Children) .KeyColumn("ParentID") .Inverse() .C

我希望能够创建一个包含子对象的父对象,并让父对象处理更新、保存和删除

我的地图课

父地图

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

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

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处理这个问题的最佳方法吗


谢谢。

请先尝试清除儿童收藏:

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

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

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

我通常如何确保这一点?我使用私有setter将集合设置为只读。然后,我向父类添加方法以根据需要修改列表

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);
}
private IList theChildCollection=new List();
/// 
///儿童记录的收集。
/// 
公共虚拟现实主义儿童
{
得到
{
将childCollection.ToList()作为只读()返回;
}
专用设备
{
ChildCollection=值;
}
}
/// 
///将记录添加到子集合。
/// 
公共作废添加(儿童记录记录)
{
childCollection.Add(aRecord);
}
/// 
///从子集合中删除记录。
/// 
公共作废删除(儿童记录记录)
{
ChildCollection.移除(aRecord);
}

看起来是个不错的解决方案,我将修改我的代码。唯一的问题是,当我处理两个列表时,要找出要添加、更新和删除的子对象:一个是旧的子对象(来自db),另一个是修改过的子对象(来自用户输入)。你知道一种不用在列表中循环的方法吗?谢谢。Calum——请将其作为一个新问题添加。谢谢您的快速回复。我试过上面的方法,它返回一个NotUniqueException。除了扩展名,你们有IEnumerable的例子吗?谢谢