使用NHibernate删除一对多关系中的子对象时遇到问题

时间:2012-06-24 20:45:48

标签: nhibernate nhibernate-mapping one-to-many

标题几乎总结了我所面临的问题。基本上我有两个班级:

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
但似乎没什么用。有人可以指点我正确的方向吗?谢谢你的帮助!!

1 个答案:

答案 0 :(得分:0)

我认为它必须对Cascade选项做一些尝试将Cascade改为All_Delete_Orphan来自Cascade.All

http://ayende.com/blog/1890/nhibernate-cascades-the-different-between-all-all-delete-orphans-and-save-update