NHibernate多对多插入null id与hilo生成器

时间:2014-08-04 08:50:23

标签: asp.net nhibernate many-to-many inverse hilo

我有3个表:User,Department和UserDepartment。用户可以与多个部门相关联,部门可以与多个用户相关联。我在这两边使用多对多的流畅映射:

对于部门

HasManyToMany(x => x.Users)
    .Table("UserDepartment")
    .ParentKeyColumn("DepartmentId")
    .ChildKeyColumn("UserId")
    .AsSet()
    .Cascade.All();

对于用户

HasManyToMany(x => x.Departments)
    .Table("UserDepartment")
    .ParentKeyColumn("UserId")
    .ChildKeyColumn("DepartmentId")
    .AsBag()
    .Inverse()
    .Cascade.None();

所有表格都使用HiLo Id生成器和几乎相似的映射,如下所示:

Id(p => p.Id).GeneratedBy.HiLo("HiLo", "NextHi", "32", "ForTable = 'UserDepartment'");

当我尝试将部分用户添加到部门时,nhiberante失败并显示错误:

  

无法执行批处理命令。[SQL:SQL不可用]。内心的   异常:无法将值NULL插入列' Id',表中   ' test.dbo.UserDepartment&#39 ;;列不允许空值。插入   失败。\ r \ n声明已经终止。

我有与其他表一样的HiLo生成器,因此我非常确定它不会导致此失败。

有人可以解释这个问题吗?我记得过去有过null Id插入的问题,它是通过对集合使用逆映射来解决的,但我不能在两边使用逆,所以我需要另一种解决方案。

1 个答案:

答案 0 :(得分:1)

最后我找到了解决方案。有两种方法:

  1. 从表中删除合成ID并改为使用复合ID。
  2. 使用XML映射指定idbag行为。
  3. 如下所示:NHibernate, HiLo and many-to-many association