NHibernate Save正在尝试在更新时清除子KeyColumn ID

间谍

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

当我第一次尝试保存该对象时,它可以按预期工作,没有任何问题(级联所有ID和孩子)。当我尝试从数据库中获取对象时,更新它的一些属性并再次重新保存它,它将失败。我收到的实际错误消息是“无法删除集合”。

上面的错误是由于以下事实造成的:它试图将子对象上的“ ParentId”字段设置为NULL(这违反了数据库中的FK约束)。如果我从数据库中删除此约束,最终结果就是我想要的。但是,我根本不希望它执行此更新(将父ID设置为null),而且我不确定为什么这样做。从我可以在SQL代码中看出来的信息来看,它正在生成并发送给数据库,其他所有内容似乎都是正确的,并且如果不是最后一条更新语句,那一切都可以正常工作。

显然,我的映射一定有问题,但是我无法弄清楚是什么。我尝试添加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);
        }
    }
拉迪姆·科勒

这是由以下事实造成的,是的集合儿童未标记为inverse="true"

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

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

一个Child必须参考Parent

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
    }
}

现在,您必须一直在C#代码中正确设置该关系。即,如果将子级添加到“父级”集合中,则还应设置“父级”引用

parent.Children.Add(child);
child.Parent = parent;

NHibernate现在将仅发出一条语句,以从其表中删除子级

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

NHibernate Save正在尝试在更新时清除子KeyColumn ID

来自分类Dev

NHibernate Composite-ID子级联异常

来自分类Dev

NHibernate如何更新实体中新插入的ID?

来自分类Dev

NHibernate尝试在删除操作中将ID更新为null

来自分类Dev

NHibernate代理ID值

来自分类Dev

NHibernate ID生成-重复项

来自分类Dev

在NHibernate中从子级创建级联时,如何获得新的父级ID?

来自分类Dev

nhibernate:批量执行更新

来自分类Dev

更新了Nhibernate的文档?

来自分类Dev

选择时Nhibernate更新实体

来自分类Dev

Nhibernate将id = 0存储为null

来自分类Dev

如何在NHibernate中自动生成ID

来自分类Dev

如何覆盖NHibernate身份ID名称

来自分类Dev

Nhibernate所在子串错误

来自分类Dev

通过NHibernate更新复合主键

来自分类Dev

如何使用Nhibernate更新行

来自分类Dev

NHibernate:无复合键更新

来自分类Dev

如何使用Nhibernate更新行

来自分类Dev

流利的NHibernate复合ID长度设置不正确

来自分类Dev

流利的NHibernate映射到SQL Server CHAR(10)ID列

来自分类Dev

C#NHibernate ID自动删除或不重置?

来自分类Dev

为什么ID setter在NHibernate基本实体中受到保护?

来自分类Dev

流利的NHibernate映射到SQL Server CHAR(10)ID列

来自分类Dev

Nhibernate字典<Entity,?> Entity.ID哈希码问题

来自分类Dev

nHibernate为Id生成Guid,但属性为字符串

来自分类Dev

NHibernate中的SaveOrUpdate:相关者实体的ID为0

来自分类Dev

流利的NHibernate复合ID长度设置不正确

来自分类Dev

Nhibernate类映射将“ _id”附加到列名

来自分类Dev

如何在NHibernate中获取具有ID的商品列表