2

そのため、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 の使用に関するいくつかの投稿を読みましたが、新しい行を作成して古い行を削除するのではなく、子行を更新するべきではない理由がわかりません。マッピングの概念を理解していないだけかもしれません。

どんな援助でも大歓迎です

4

1 に答える 1

2

関連するコードを見ないで推測する必要がありますが、これがどのように機能するかです。

// 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 では、オブジェクトが実際に古いオブジェクトを破棄し、完全に異なるオブジェクトに置き換えるため、常に新しい行を挿入します。そのため、オプションを使用する必要があります。これにより、新しい行が挿入されたときに、使用されなくなった古い行がデータベースから削除されます。ParentChildDeleteOrphanChild

ただし、ケース 2 では、オブジェクトは同じままで、そのプロパティのみが更新されるため、既存の行を更新する必要があります。

これがあなたの質問に答えることを願っています。

于 2013-10-04T09:28:49.740 に答える