这是在以下代码中复制的一个奇怪的代码:
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");
现在这就是我感到困惑的地方。请注意,在我的初始代码中,开始和提交 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 映射有什么“错误”?