NHibernate Save正在尝试在更新时清除子键列Id

NHibernate Save正在尝试在更新时清除子键列Id,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,我正在尝试创建一个父对象,该对象在一对多关系中有多个子对象。我不是在子对象上引用父对象,而是将其keycolumn映射为字段 当我第一次尝试保存这个对象时,它可以正常工作,没有任何问题(级联所有Id和子项)。当我试图从数据库获取对象,更新它的一些属性并再次保存它时,它失败了。我收到的实际错误消息是“无法删除集合” 上面的错误是因为它试图将子对象上的“ParentId”字段设置为NULL(这违反了我在db中的FK约束)。如果我从数据库中删除这个约束,最终结果就是我想要的;但是,我根本不希望它执行此

我正在尝试创建一个父对象,该对象在一对多关系中有多个子对象。我不是在子对象上引用父对象,而是将其keycolumn映射为字段

当我第一次尝试保存这个对象时,它可以正常工作,没有任何问题(级联所有Id和子项)。当我试图从数据库获取对象,更新它的一些属性并再次保存它时,它失败了。我收到的实际错误消息是“无法删除集合”

上面的错误是因为它试图将子对象上的“ParentId”字段设置为NULL(这违反了我在db中的FK约束)。如果我从数据库中删除这个约束,最终结果就是我想要的;但是,我根本不希望它执行此更新(将父id设置为null),我也不知道为什么会这样。从它生成并发送到DB的SQL代码中可以看出,其他一切似乎都是正确的,如果不是最后一条update语句,那么一切都可以正常工作

显然,我的映射肯定有问题,但我不知道是什么。我尝试添加Not.KeyUpdate(),但这只会使它根本无法生成密钥。有人知道我做错了什么吗

提前谢谢,我真的很感激

有关我的映射,请参见以下内容:

public class Parent
    {
        public Parent()
        {
            Children = new List<Child>();
        }

        public virtual Guid Id { get; set; }

        public virtual IList<Child> Children { get; set; }
    }

    public class Child
    {
        public virtual Guid Id { get; set; }

        public virtual Guid ParentId { get; set; }
    }

    public class ParentMap : ClassMap<Parent>
    {
        public ParentMap()
        {
            Table("Parent");
            Id(x => x.Id);
            HasMany(x => x.Children).KeyColumn("ParentId").Cascade.SaveUpdate().Not.LazyLoad();
        }
    }

    public class ChildMap : ClassMap<Child>
    {
        public ChildMap()
        {
            Table("Child");
            Id(x => x.Id);
            Map(x => x.ParentId);
        }
    }
公共类父类
{
公共家长()
{
Children=新列表();
}
公共虚拟Guid Id{get;set;}
公共虚拟IList子项{get;set;}
}
公营儿童
{
公共虚拟Guid Id{get;set;}
公共虚拟Guid父ID{get;set;}
}
公共类ParentMap:ClassMap
{
公共ParentMap()
{
表(“母公司”);
Id(x=>x.Id);
HasMany(x=>x.Children).KeyColumn(“ParentId”).Cascade.SaveUpdate().Not.LazyLoad();
}
}
公共类ChildMap:ClassMap
{
公共儿童地图()
{
表(“儿童”);
Id(x=>x.Id);
Map(x=>x.ParentId);
}
}

这是因为子项集合未标记为
reverse=“true”

您可以做的是:I.从数据库中删除约束。NHiberante只需执行2个步骤(无反向设置)。首先更新记录以中断关系,其次(由于级联),也删除该项

二,。更改映射和实体。像这样:

子项
必须引用父项:

public class Child
{
    public virtual Guid Id { get; set; }

    public virtual Guid ParentId { get; set; }
    public virtual Parent Parent { get; set; }
}
然后映射将如下所示:

public class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        Table("Parent");
        Id(x => x.Id);
        HasMany(x => x.Children)
            .KeyColumn("ParentId")
            .Cascade.SaveUpdate()
            .Not.LazyLoad()
            .Inverse() // here we do have the inverse setting
            ;
    }
}

public class ChildMap : ClassMap<Child>
{
    public ChildMap()
    {
        Table("Child");
        Id(x => x.Id);
        Map(x => x.ParentId).Not.Insert().Not.Update(); // this is readonly now
        References(x => x.Parent).Column("ParentId"); // just a Parent is writable
    }
}

NHibernate现在只发布一条声明,将child从表中删除

非常感谢您的帮助和解释。这完全有道理!如果这有帮助的话,那就太好了。享受NHibernate,伟大的工具;)
parent.Children.Add(child);
child.Parent = parent;