当前位置: 首页 > 面试题库 >

无法删除集合:[NHibernate.Exceptions.GenericADOException]

乐正峰
2023-03-14
问题内容

我有两个表,tableA和tableB。

tableA具有列:tabAId,col2,col3 (tabAId primaryKey和Identity列。)

tableB具有列:tabAId,名称 (tabAId不为空)

我在tableA的hbm文件中创建了Bag,以维护关系。

<bag name="tableB" lazy="true" inverse="false"
                    batch-size="25" cascade="all-delete-orphan">
  <key column="tabAId" />
  <one-to-many class="tableB" />
</bag>

当我尝试更新 tableA中的 记录时,它将引发异常,因为我在tableA实例中有子项列表。

[NHibernate.Exceptions.GenericADOException] =
{“无法删除集合:[MIHR.Entities.tableA.tableB#21] [SQL:UPDATE dbo.tableB SET tabAId
= null WHERE tabAId = @ p0]”}

InnerException =
{“无法将值NULL插入表’SA_MIHR_DEV.dbo.tableB’的列’tabAId’中;该列不允许为空。UPDATE失败。\ r \
n该语句已终止。”}


问题答案:

只有两种方法可以解决此问题。

1)不要使用 inverse="false"

<bag name="tableB" lazy="true" inverse="true" // instead of false
                    batch-size="25" cascade="all-delete-orphan">
  <key column="tabAId" />
  <one-to-many class="tableB" />
</bag>

此设置 (inverse =“ true”) 将指示NHibernate直接从数据库中删除 项目

虽然使用inverse="false"will通常会导致:

  • UPDATE(带null)==从集合中删除
  • 删除项目==级联行为

2)使引用列可为空

这意味着,我们可以让NHibernate进行UPDATE和DELETE。因为column现在可以为空。

这些只是这里解决问题的两种方法

我的偏好是: inverse =“ true”

为了正常工作, inverse="true" 我们总是必须在C#中分配关系的两端。这对于Add(),INSERT操作是必须的:

Parent parent = new Parent();
Child child = new Child
{
    ...
    Parent = parent,
};
// unless initialized in the Parent type, we can do it here
parent.Children = parent.Children ?? new List<Child>();
parent.Children.Add(child);

// now just parent could be saved
// and NHibernate will do all the cascade as expected
// and because of inverse mapping - the most effective way
session.Save(parent);

如我们所见,我们 已经 明确 指定
了关系的双方。必须从NHibernate逆映射中获利。这也是一个好习惯,因为稍后,当我们期望从数据库加载数据时,NHibernate将为我们设置该设置



 类似资料:
  • 无法从外壳中删除集合, 集合可用并且我的 php 脚本正在访问它的东西(选择|更新) 但当我使用: 它给了我一个错误:

  • 我正在从db检索一个集合,想要删除它。这是密码。 这就是错误所在。 我也试着给所有的列名。

  • 在 MongoDB 中,可以使用 drop() 方法来从数据库中删除指定集合,它会从数据库中完全删除一个集合,并且不会留下与已删除集合关联的任何索引。 drop() 方法在使用时不需要带有任何参数,并且在使用参数调用时会产生错误,该方法的语法格式如下: db.collection_name.drop() 其中 collection_name 为要删除的集合名称,方法调用成功会返回 true,否则返

  • 本文向大家介绍详解MongoDB中创建集合与删除集合的操作方法,包括了详解MongoDB中创建集合与删除集合的操作方法的使用技巧和注意事项,需要的朋友参考一下 创建集合:createCollection() 方法  是用来创建集合. 语法: 基本的 createCollection() 命令语法如下: 在命令中, name 是要创建的集合的名称. Options 是一个文件,用于指定配置的集合 参

  • 问题内容: 也许我只是盲目的,但是我没有在Redis中看到用于清空现有集合(而不清空整个数据库)的显式set命令。目前,我正在对场景本身进行设置差异,并将其存储回自己: 但这看起来有点愚蠢……有更好的方法吗? 问题答案: 您可以使用将所有设置删除。 在redis控制台中,

  • 问题内容: 我有一个(尽管我猜这个问题也适用于其他集合)对象。据我了解,当文档讨论删除映射时,那么它就是从哈希表中删除条目,即不一定破坏实际对象。如果该表中唯一剩余的对该对象的引用,那么该对象会被垃圾回收吗? 如果我这样做了,并且表中的那些对象没有在其他任何地方引用,它们会被垃圾回收吗? 最快的方法是实际从表中删除所有条目,同时销毁那些对象。 问题答案: 是的,如果集合是最后引用这些对象的地方,则