【问题标题】:fluent nhibernate Cascade creates new records instead of updating themfluent nhibernate Cascade 创建新记录而不是更新它们
【发布时间】:2012-08-01 19:08:07
【问题描述】:

因此,对于 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();
    }
}

确实没有子对象独立于父对象保存的情况。我试过 cascade.all() 和 cascade.saveupdate() 都产生相同的结果。

我已经阅读了几篇关于使用 AllDeleteOrphan 的帖子,但我不明白为什么它不应该只更新子行而不是创建新行并删除旧行。也许我只是不明白映射的概念。

感谢您的帮助

【问题讨论】:

  • 您确定您的 Clild 记录在您保存父项时有 id 吗?
  • 是的,如果子记录是新的,则 id 为 0,并且 nhibernate 在插入时分配 id。如果子记录正在更新,它会将记录 id 作为父应保存的子记录集合的一部分传递

标签: c# model-view-controller nhibernate fluent-nhibernate


【解决方案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 应该更新现有行,因为对象保持不变,并且仅更新其属性。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2023-01-12
    • 1970-01-01
    • 2012-07-25
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多