我希望能够创建一个带子节点的父对象,让父节点处理更新,保存和删除。
我的地图课程。
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中处理这个问题的最佳方法吗?
感谢。
答案 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扩展方法来确定需要添加或删除哪些子项并单独处理它们。