0

我有 3 个表:用户、部门和用户部门。用户可以关联多个部门,部门可以关联多个用户。我在双方都使用多对多流畅映射,如下所示:

对于部门

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”;列不允许空值。INSERT 失败。\r\n语句已终止。

我有相同的 HiLo 生成器与其他表一起使用,所以我很确定它不会导致此故障。

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

4

1 回答 1

1

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

  1. 从表中删除合成 ID 并改用合成 ID。
  2. 使用 XML 映射来指定 idbag 行为。

如:NHibernate、HiLo 和多对多关联

于 2014-08-05T11:09:26.873 回答