因此,对于n-hibernate和流畅的n-hibernate来说,这是新手,我对于子对象的映射和级联更改感到困惑。
我有一个包含多个集合的对象,当我创建一个新对象时,它会创建子对象并将它们插入到各自的表中。这一切都很好,很好。但是,当我通过表面上的子对象更改来更新父对象时,它似乎只是按照我想要的方式流动。问题是,在查看数据库时,我发现它不是更新子对象记录,而是插入了新记录,并从原始记录中删除了与父对象的关联,而不仅仅是更新它们。
要添加其他说明,我们使用的是AutoMapping和MappingOverrides。所以这里简要介绍一下我正在使用的代码。
public class ParentObjectOverride : IAutoMappingOverride<ParentObject>
{
public void Override(AutoMapping<ParentObject> mapping)
{
mapping.HasMany(x => x.Chid1).Cascade.SaveUpdate().Table("chid1Table");
mapping.HasMany(x => x.Child2).Cascade.SaveUpdate().Table("child2Table");
}
}
public class Child1Override : IAutoMappingOverride<Child1>
{
public void Override(AutoMapping<Child1> mapping)
{
mapping.References(x => x.ParentObject).Cascade.All();
}
}
public class Child2Override : IAutoMappingOverride<Child2>
{
public void Override(AutoMapping<Child2> mapping)
{
mapping.References(x => x.ParentObject).Cascade.All();
}
}
确实没有子对象独立于ParentObject保存的情况。我尝试过cascade.all()以及cascade.saveupdate()都会产生相同的结果。
我已经阅读了几篇关于使用AllDeleteOrphan的帖子,但我不明白为什么它不应该只更新子行而不是创建新行并删除旧行。也许我只是不理解映射概念。
感谢任何帮助
答案 0 :(得分:1)
如果没有看到相关代码,我将不得不猜测,但这是它的工作原理。
// Case 1
var parent = LoadParentAndChildrenFromDatabase();
parent.Child1 = new Child1();
parent.Child2 = GetChild2OjbectFromSomewhere();
SaveParentAndChildrenToDatabase();
// Case 2
var parent = LoadParentAndChildrenFromDatabase();
parent.Child1.SomeProperty = "new_value";
parent.Child2.AnotherProperty = 15;
SaveParentAndChildrenToDatabase();
在案例1中,您将始终插入新行,因为您的Parent
对象实际上抛弃了旧的Child
对象并将其替换为完全不同的对象。这就是为什么你需要使用DeleteOrphan
选项 - 以便在插入新的时候从数据库中删除旧的,不再使用的Child
行。
但是,情况2应该更新现有的行,因为对象保持不变并且只更新其属性。
我希望这能回答你的问题。