これは、次のコードで複製された奇妙なものです。
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 マッピングの「問題」は何ですか?