如何查找是否可以删除引用的对象?

Jey*_*han 10 nhibernate cascade foreign-keys cascading-deletes

我有一个名为"Customer"的对象,它将在其他表中用作外键.

问题是我想知道是否可以删除"客户"(即,它没有在任何其他表中引用).

Nhibernate有可能吗?

Jag*_*uar 5

您要问的是Customer在引用的表FK列中找到PK值的存在.有很多方法可以解决这个问题:

  1. 正如kgiannakakis所指出的那样,尝试执行删除操作,如果抛出异常则回滚.有效但丑陋而无用.这还要求您在数据库中设置CASCADE ="RESTRICT".此解决方案的缺点是您必须尝试删除该对象以找出您不能删除的对象

  2. 映射Customer作为集合引用的实体,然后映射每个集合,如果它们Count > 0不允许删除.这很好,因为只要映射完成,这对于模式更改是安全的.这也是一个糟糕的解决方案,因为必须进行额外的选择.

  3. 有一个执行查询的方法bool IsReferenced(Customer cust).很好,因为您可以在需要时使用单个查询.不太好,因为它可能容易因架构和/或域更改而导致错误(取决于您将要执行的查询类型:sql/hql/criteria).

  4. 它自带的一个计算属性,带有映射元素<property name="IsReferenced" type="long" formula="sql-query that sums the Customer id usage in the referenced tables" />.很好,因为它是一个快速的解决方案(至少与数据库一样快),没有其他查询.不太好,因为它易受架构更改的影响,因此当您更改数据库时,不要忘记更新此查询.

  5. 疯狂的解决方案:创建一个进行计算的模式绑定视图.在需要时对其进行查询.很好,因为它的模式绑定并且不太容易受到模式更改的影响,因为查询很快,不太好,因为您仍然需要执行其他查询(或者您在解决方案4上映射此视图的结果).

2,3,4也很好,因为你也可以将这种行为投射到你的UI(不允许删除)

就个人而言,我会选择4,3,5