0

私は NHibernate 3.2 を使用しており、Mapping by Code を使用しています。

テスト ケースは非常に簡単です。多対多のコレクションでリンクされた Store と Product があります。StoreMap の多対多コレクションは、次のようにマップされます。

Set(x => x.Products, x =>
        {
            x.Fetch(CollectionFetchMode.Subselect);
            x.Key(key =>
            {
                key.Column("StoreId");
                key.ForeignKey("FK_StoreProducts_Store");
            });
            x.Table("StoreProducts");
            x.Cascade(Cascade.None);
            x.Inverse(true);

        },

私が正しければ、カスケード オプションを使用すると、クラスの操作をコレクションにもカスケードするかどうかを選択できるはずです。NHibernate 3.2 では、これらのオプションを使用できますが、これは私にとっては簡単ではありません。

[Flags]
public enum Cascade
{
    None = 0,
    Persist = 2,
    Refresh = 4,
    Merge = 8,
    Remove = 16,
    Detach = 32,
    ReAttach = 64,
    DeleteOrphans = 128,
    All = 256,
}

私が使用している例は次のとおりです。ここでは、テスト ストアとテスト製品を作成し、それをストアに割り当てています。次に、ストアをリロードし、最初の製品を取得して更新し、ストアを保存しています。

カスケードが「なし」に設定されていても、製品は更新されます! これが起こるのは普通ですか?

using (var session = SessionFactory.OpenSession())
        {
            long storeId = 5;
            using (var t = session.BeginTransaction())
            {
                Product p1 = new Product();
                p1.Name = "Product 1";
                session.Save(p1);

                Store store = new Store();
                store.Name = "Tesco";
                session.Save(store);

                p1.Stores.Add(store);
                store.Products.Add(p1);
                session.Save(store);

                storeId = store.Id;
                t.Commit();
            }

            using (var t = session.BeginTransaction())
            {
                Store s = session.Get<Store>(storeId);
                Product p = s.Products.FirstOrDefault();
                p.Name = "Product 1 Updated";
                session.Save(s);
                t.Commit(); // <-- Product is still being updated here!

            }
            session.Flush();
        }
4

1 に答える 1

1

あなたが直面している機能は変更追跡と呼ばれ、カスケード オプションとは関係ありません。NHibernate は、セッションに関連付けられているすべてのオブジェクトを追跡し、トランザクションがコミットされたときにすべての変更を DB に送信します。

必要がない場合は、追跡されていないエンティティを取得するためにステートレス セッションを使用できます。ただし、この場合、遅延読み込みはありません。FlushMode.Neverまた、NHibernate が DB への変更を自動的にフラッシュするのを防ぐために使用することもできます。

于 2011-10-11T11:43:16.070 に答える