2

エンティティコレクションに要素を追加するコードがあります(1対多の関係)。これはISession.Saveを使用したバージョンです

        using (ISession session = sessionFactory.OpenSession())
        {
            var package = session.QueryOver<Package>().Where(x => x.ID == selectedPackage).SingleOrDefault();
            foreach(var themeId in selectedThemes)
            {
                var selectedTheme = session.QueryOver<HBTheme>().Where(x => x.ID == themeId).SingleOrDefault();
                if (selectedTheme != null)
                {
                    package.Themes.Add(new PackageTheme() { Package = package, Theme = selectedTheme });
                }
            }
            session.Save(package);
        }

そのバージョンは私には機能しませんでした。ITransactionでテストを書いたので、少し変更して次のようにしました。

        using (ISession session = sessionFactory.OpenSession())
        using (ITransaction transaction = session.BeginTransaction())
        {
            var package = session.QueryOver<Package>().Where(x => x.ID == selectedPackage).SingleOrDefault();
            foreach(var themeId in selectedThemes)
            {
                var selectedTheme = session.QueryOver<HBTheme>().Where(x => x.ID == themeId).SingleOrDefault();
                if (selectedTheme != null)
                {
                    package.Themes.Add(new PackageTheme() { Package = package, Theme = selectedTheme });
                }
            }
            transaction.Commit();
        }

そして今それは動作します。package.Themesコレクションの要素はデータベースに保存されます。どうして?ありがとう!

4

1 に答える 1

7

りんごとみかんの比較!

  1. Save()はNHibernateに「このオブジェクトを永続化する必要がある」ことを通知します。INSERTステートメントが発行される正確なタイミングは定義されておらず、しばらくしてから発生する可能性があります。
  2. カスケード設定によっては、Save()が不要な場合があります。
  3. 常にトランザクションを使用する必要があります。
  4. ダーティ状態がクエリの結果に影響を与える可能性がある場合、デフォルトでは、ダーティ状態の実際のデータベースへのフラッシュは、トランザクションのコミット時およびクエリ時に発生します。

ケース1で何が起こるかは、フラッシュ操作がトリガーされない可能性があります。ケース2の場合、トランザクションコミットがフラッシュをトリガーしている間に、コレクションのカスケードが原因でアイテムが保存されている可能性があります。

于 2012-05-30T13:36:54.077 に答える