1

これは、次のコードで複製された奇妙なものです。

        using (ISession session = RepositoryTestHelper.SessionFactory.OpenSession())
        {
            //session.BeginTransaction();

            UserRepo repo = new UserRepo(session);
            CompanyRepo cRepo = new CompanyRepo(session);
            var user = repo.FindByEmail("test.user@blah.com");
            user.CompanyAssociations.Add(new CompanyUserAssoc() 
                { 
                    User = user,
                    Company = cRepo.GetById(1)
                });
            repo.AddOrUpdate(user);

            //session.Transaction.Commit();
        }

また、ユーザー、会社、および CompanyUserAssoc の関係はかなり単純です。

会社の場合:

HasMany<CompanyUserAssoc>(x => x.UserAssociations).KeyColumn("User_id");

ユーザーの場合:

HasMany<CompanyUserAssoc>(x => x.CompanyAssociations).KeyColumn("Company_id")

関連付けクラス自体については、次のようになります。

References(x => x.Company).UniqueKey("CompanyId_UserId");
References(x => x.User).UniqueKey("CompanyId_UserId");

今、これは私が困惑しているところです。最初のコードで、begin と commit の trans 呼び出しがコメント アウトされていることに注意してください。これは実際にコードが機能することを意味します! CompanyUserAssoc が作成され、ID が 1 のユーザーと会社が正しく参照されます。

しかし...悲しいことに、これをトランザクションに入れると、次のエラーが発生します。

{"The UPDATE statement conflicted with the FOREIGN KEY constraint \"FK3C47859753A62C6E\". The conflict occurred in database \"xxxx\", table \"dbo.Company\", column 'Id'.\r\nThe statement has been terminated."}

しかし、なぜ?それが私の質問です。プロファイラーで私が見たのは、これが次のことを行うということです:

exec sp_executesql N'UPDATE [CompanyUserAssoc] SET Company_id = null WHERE Company_id = @p0',N'@p0 int',@p0=1

待って…何?ヌル?会社IDをnullに設定しているのはなぜですか? なぜトランザクション中にのみこれを行うのですか? Nhibernate マッピングの「問題」は何ですか?

4

2 に答える 2

0

両方のコレクションが非反転 (デフォルト) としてマップされ、Company コレクションにはユーザーがいないため、その更新を発行してリンク テーブルをクリアします。UserAssociationsを逆に設定してみていただけますか?または、明示的なリンク テーブルが関係する場合に私が通常行うことは、両方HasManyの s を逆に設定し、単純にリンク テーブルを直接操作することです。

于 2013-02-01T19:56:56.347 に答える
0

これは結局アカニシンであり、私が軽蔑するようになった魚です. 急いでインテリセンスに依存していたので、Company の UserAssocations プロパティが IList ではなく IList であることに気付きませんでした。はい、愚かにもドメイン クラスの代わりに Nhib マップ クラスを選択してしまいました..これは奇妙なことに、期待どおりにエラーが発生せず、トランザクションなしで機能しましたが、なぜですか?

まあ-Nhibは関連エントリを挿入できましたが、同じテーブルをすでに挿入したIDで更新する必要があると信じていました(どういうわけかそれを別のエンティティと見なしているためですか?)。タイプを使用していたので、マップクラス自体でコンパイルエラーが発生することを期待していましたが、そうではありませんでした。そして、トランザクションがなければ、生成されたSQLは機能します。

理由についてもっと調査しますが、見逃すと多くの調査につながる可能性のあるまれで愚かな間違いを強調するためにこれに答えました。

于 2013-02-03T17:06:08.117 に答える