gpt4 book ai didi

c# - fluent nhibernate Cascade 创建新记录而不是更新它们

转载 作者:太空宇宙 更新时间:2023-11-03 13:57:15 25 4
gpt4 key购买 nike

因此,作为 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 的文章,但我不明白为什么它不应该只更新子行而不是创建新行并删除旧行。也许我只是不了解映射概念。

感谢任何帮助

最佳答案

在没有看到相关代码的情况下,我将不得不猜测,但这是它的工作原理。

// 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 应该更新现有的行,因为对象保持不变并且只更新其属性。

我希望这能回答您的问题。

关于c# - fluent nhibernate Cascade 创建新记录而不是更新它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11765880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com