标题几乎总结了我所面临的问题。基本上我有两个班级:
public class Parent : IIntegerIdentifiable
{
public virtual long Id { get; set; }
public virtual ICollection<Child> Children {get; set; }
}
public class Child : IIntegerIdentifiable
{
public virtual long Id { get; set; }
public virtual Parent Parent { get; set; }
}
我正在定义这些类之间的一对多关系。这两个类的类映射是:
public sealed class ParentMap : ClassMap<Parent>
{
public ParentMap()
{
Id(x => x.Id).GeneratedBy.HiLo(
"HiLoUniqueKey", "NextHi", "99", "ObjectType = 'Parent'");
HasMany(x => x.Children).KeyColumn("Parent_Id").Inverse().Cascade.AllDeleteOrphan();
}
}
public sealed class ChildMap : ClassMap<Child>
{
public ChildMap()
{
Id(x => x.Id).GeneratedBy.HiLo("HiLoUniqueKey", "NextHi", "99", "ObjectType = 'Child'");
References(x => x.Event).Cascade.All();
}
}
由于我想从数据库中删除特定父级的所有子级,因此我在ChildRepository中编写了以下函数:
public void ClearChildEntries(long parentId)
{
//I had tried the following and was getting errors before I read the other posts on the topic
//QueryOver().Where(x => x.Event.Id == eventId).List().ToList().ForEach(Remove);
//Session.flush()
//Current code
var parent = _parentRepository.GetById(parentId);
parent.Children.Clear();
_parentRepository.SaveOrUpdate(parent);
}
我们设置了代码,以便在请求结束时调用flush。每当我尝试执行代码时,都会收到错误:
无法将值NULL插入列'parent_id',表'test.dbo.Child';列不允许空值。更新失败。
我还尝试首先删除每个子实体并刷新会话,然后更新父集合。它给出了同样的错误。问题是 a)为什么nHibernate试图将父id列更新为null然后删除? b)我可以做些什么来使删除工作?
为了让你知道我不是在浪费你的时间,我已经在这个主题上提到了其他帖子,比如
- How to delete child object in NHibernate?
- http://ayende.com/blog/1890/nhibernate-cascades-the-different-between-all-all-delete-orphans-and-save-update
但似乎没什么用。有人可以指点我正确的方向吗?谢谢你的帮助!!
答案 0 :(得分:0)
我认为它必须对Cascade选项做一些尝试将Cascade改为All_Delete_Orphan来自Cascade.All