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的例子吗?谢谢