我试图创建一个父对象,该对象在一对多关系中具有多个子对象。我没有在子对象上引用父对象,而是将其键列映射为字段。
当我第一次尝试保存该对象时,它可以按预期工作,没有任何问题(级联所有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] 删除。
我来说两句