1

Packageと多対多の関係を持つShapeというクラスがあります。この双方向の関係の意味は、製品が特定の形状を持っている場合、その形状が関連付けられているパッケージによってパッケージ化できるということです。これは逆にも適用されます。製品がパッケージによってパッケージ化されている場合、これは、製品がこのパッケージに関連付けられた形状である必要があることを意味します。

したがって、Shapeを含むPackagesとPackageを含むShapesを含むドメインモデルがあります。したがって、NHマッピングは、Shape、Package、およびPackageToShapeテーブルになります。

ただし、バージョン管理を適用すると、PackageToShapeテーブルに複数の更新と挿入が発生します。実際には、たとえば、ShapeId = 1、PackageId = 1のような関係が最初に削除されてから、再度挿入されます。実際には、Guidを使用します。しかし、重要なのは、この設定では、NHは多対多のテーブルに複数の削除および挿入ステートメントを作成し、最初に行を削除してから、まったく同じ行を再度追加することです。

これを防ぐ方法はありますか?

マッピング(Fluent NHを使用)

public sealed class ShapeMap: EntityMap<Shape, Guid, ShapeDto>
{
    public ShapeMap()
    {
        HasManyToMany(s => s.Packages)
            // Fetch.Join will raise laizy collection load error
            .Fetch.Select()
            .AsSet()
            .Cascade.All();
        HasManyToMany(s => s.UnitGroups)
            // Fetch.Join will raise laizy collection load error
            .Fetch.Select()
            .AsSet()
            .Cascade.All();
        HasManyToMany(s => s.Routes)
            // Fetch.Join will raise laizy collection load error
            .Fetch.Select()
            .AsSet()
            .Cascade.All();
    }

パッケージのマッピング:

public class PackageMap : EntityMap<Package, Guid, PackageDto>
{
    public PackageMap()
    {
        Map(p => p.Abbreviation).Not.Nullable().Length(30).Unique();
        HasManyToMany(p => p.Shapes)
            // Fetch.Join will raise laizy collection load error
            .Fetch.Select()
            .AsSet()
            .Inverse()
            .Cascade.All();
    }
}

エンティティマップは、ID、名前(一意)、およびバージョンのマッピングを実装します。

4

1 に答える 1

0

私は問題を見つけました。コレクションのセッターで私は新しいリストを作成しましたが、これはNHではできないようです。内側のHashSetをIEnumerableとして外の世界に公開したかったのですが、これが好ましい方法だと思います。これらのコレクションの保護されたセッターには、次のようなコードがありました。

protected set { _mySet = new HashSet(value); }

私が遭遇した2番目の問題は、NHがネイティブドットネット4ISetをサポートしていないことでした。NHが提供するセット(Iesi.Collections.Generic.ISet)を実装する必要があります。

何が起こったのかというと、NHが提供するコレクションから新しい内部コレクションを作成したので、NHは、これは同じコレクションではないので、このオブジェクトはダーティであるため、バージョンを更新して、これらの変更のカスケードを開始します。

私が尋ねたこの質問は、私が取り組んでいたジレンマを要約していますが、現在は解決されているようです:ビジネスコレクションを処理するためのアプローチ

于 2011-08-25T08:57:52.123 に答える