具有sqlite的NHibernate抛出GenericADOException“;约束失败 FOREING

本文关键字:约束 失败 FOREING GenericADOException sqlite NHibernate 抛出 具有 | 更新日期: 2023-09-27 18:20:29

根据Ayende的建议,我正在尝试建立一个内存中的sqlite数据库进行单元测试。除了一个实体UserPermission总是导致NHibernate抛出GenericADOException"constraint failed''r''nFOREING KEY constraint failed"之外,一切都很好

这是一种标准的一对多关系;每个用户可以具有零个、一个或多个UserPermissions。

以下是我的型号:

public class User
{
    public virtual int Id { get; set; }
    public virtual string LastName { get; set; }
    public virtual string FirstName { get; set; }
    public virtual IList<UserPermission> UserPermissions { get; set; }
}
public class UserPermission
{
    public virtual int Id { get; set; }
    public virtual int PermissionId { get; set; }
    public virtual User User { get; set; }
    public virtual Organization Organization { get; set; }
}

以下是映射:

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Table("USERS");
        Id(x => x.Id).Column("USER_ID").GeneratedBy.Native(x => x.AddParam("sequence", "SEQ_USERS"));
        HasMany(x => x.UserPermissions);
        Map(x => x.LastName);
        Map(x => x.FirstName);
    }
}
public class UserPermissionMap : ClassMap<UserPermission>{
    public UserPermissionMap()
    {
        Table("USER_PERMISSION");
        Id(x => x.Id).Column("USER_PERMISSION_ID").GeneratedBy.Native(x => x.AddParam("sequence", "SEQ_USER_PERMISSION")); 
        Map(x => x.PermissionId);
        References(x => x.User).Column("USER_ID");
        References(x => x.Organization).Column("ORG_ID").Nullable();
    }
}

今天下午,我在谷歌上搜索了很多,发现了一些看似相关的帖子,但他们的建议都不适用于我

  • 在UserMap中,我尝试将Inverse()添加到HasMany(x=>x.UserPermissions)
  • 同样在UserMap中,我尝试将Cascade.All()添加到HasMany(x=>x.UserPermissions)
  • 在UserPermissionMap中,我尝试将Cascade.All()添加到References(x=>x.User)
  • 以上的各种组合
  • 在我的测试中,组织总是为空,但我尝试将其设置为一个伪组织,但这并没有解决问题

疯狂的是,我能够针对Oracle数据库创建和保存UserPermission对象;只有当我试图针对sqlite保存UserPermission时,才会发生此错误。

具有sqlite的NHibernate抛出GenericADOException“;约束失败
FOREING

您可以尝试将HasMany映射定义为:

HasMany(x => x.UserPermissions)
  .KeyColumn("User_ID")
  .Cascade
  .AllDeleteOrphan()
  .Inverse();

。CCD_ 2将删除CCD_ 3作为其从CCD_。如果它不是所需的行为,则可以用简单的.All替换它。

弄明白了。我们有一个Permission模型,它有一个映射到UserPermission的HasMany,但UserPermissions没有对Permission模式的引用。有一次,UserPermission模型可能有一个Permission属性,该属性将返回Permission对象,然后我们将其更改为int,并忘记更新Permission映射。

以下是我在PermissionMap中发现的内容:

public class PermissionMap : ClassMap<Permission>
{
    public PermissionMap()
    {
        Table("PERMISSION");
        Id(x => x.Id).Column("PERMISSION_ID");
        Map(x => x.Name);
        HasMany(x => x.UserPermissions).LazyLoad();  // Removed this line to fix issue
    }
}

经验教训:删除到模型之间的关系时,不要忘记从两侧删除它。