0

标题几乎总结了我面临的问题。基本上我有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
但似乎没有任何效果。有人可以指出我正确的方向吗?谢谢您的帮助!!

4

1 回答 1

0

我认为它与 Cascade 选项有关尝试将 Cascade 更改为 All_Delete_Orphan From Cascade.All

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

于 2012-06-25T03:53:47.223 回答