标题几乎总结了我面临的问题。基本上我有2个课程:
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);
}
我们的代码设置为在请求结束时调用刷新。每当我尝试执行代码时,我都会收到错误消息:
无法将值 NULL 插入列“parent_id”、表“test.dbo.Child”;列不允许空值。更新失败。
我还尝试首先删除每个子实体并刷新会话,然后更新父集合。它给出了同样的错误。问题是 a) 为什么 nHibernate 试图将父 id 列更新为 null 然后删除?b)我能做些什么来让删除工作?
只是为了让您知道我没有浪费您的时间,我已经提到了有关该主题的其他帖子,例如
-如何在 NHibernate 中删除子对象?
- http://ayende.com/blog/1890/nhibernate-cascades-the-different-between-all-all-delete-orphans-and-save-update
但似乎没有任何效果。有人可以指出我正确的方向吗?谢谢您的帮助!!