具有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时,才会发生此错误。
您可以尝试将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
}
}
经验教训:删除到模型之间的关系时,不要忘记从两侧删除它。