1

誰か助けてくれないかしら。私は親子関係があり、親は子供と1対1の関係にありますが、子供は多くの親を持つことができます。

親マッピング:

public sealed class DatumMap : ClassMap<Datum>
{
    public DatumMap()
    {
        Id(x => x.Id);
        Map(x => x.DataValue);
        References(x => x.MergeField).Cascade.All();
    }
}

子マッピング:

public sealed class MergeFieldMap : ClassMap<MergeField>
{
    public MergeFieldMap()
    {
        ReadOnly();
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.MergeTag);
        HasMany(x => x.Data);
    }
}

新しい同一の子を持つ2つの新しい分離された親を作成し、それらを次々に保存すると、既存の子エンティティを再利用するのではなく、子の2つの「コピー」を保持します。

子クラスが存在する場合は、それを検索して2番目の親にアタッチすることで、強制的に再利用できます。

これを実現するためのより洗練された方法があるのではないかと思っていたので、本質的に同じ子エンティティを永続化しようとすると、既存のエンティティが使用され、そうでない場合は新しい子が作成されます。

どんな助けでも大歓迎です。

4

1 に答える 1

0

子がすでに存在する場合のルックアップは、何らかの方法で実行する必要があります。ただし、どちらの 2 つの子が同一であるかはビジネス ロジックが異なるため、そのままでは発生しません。

// code to save new Parent

Child child = ...

var parent = new Parent { Child = child };

session.Save(parent);

同一が Id を意味する場合 (GeneratedBy Assigned を想定)、

Child child = session.Get<Child>(childId);
if (child == null)
    child = new Child(childId);

子がすでに存在することがわかっている場合

// will generate a proxy instead of querying
Child child = session.Get<Child>(childId);

同一の場合は、自然な ID/キーを意味します

Child child = session.Query<Child>().FirstOrDefault(c => c.UniqueProperty == uniqueProperty);
if (child == null)
    child = new Child(childId);
于 2012-06-08T09:40:10.063 に答える