我有一个名为“Customer”的对象,它将在其他表中用作外键。
问题是我想知道是否可以删除“客户”(即,它没有在任何其他表中引用)。
Nhibernate 可以做到这一点吗?
你所要求的是找到的存在Customer
PK值在引用表FK列中。
有很多方法可以解决这个问题:
正如 kgiannakakis 所指出的,尝试进行删除,如果抛出异常则进行回滚。有效但丑陋且无用。这还要求您在数据库中设置 CASCADE="RESTRICT"。该解决方案的缺点是您必须尝试删除该对象才能发现无法删除
映射引用的实体Customer
作为集合,然后对于每个集合,如果它们Count > 0
然后不允许删除。这很好,因为只要映射完成,就可以安全地防止架构更改。这也是一个糟糕的解决方案,因为必须进行额外的选择。
有一个执行查询的方法,例如bool IsReferenced(Customer cust)
。很好,因为您可以有一个查询,您可以在需要时使用它。不太好,因为它可能容易因架构和/或域更改而出错(取决于您将执行的查询类型:sql/hql/criteria)。
类本身的计算属性,带有映射元素,例如<property name="IsReferenced" type="long" formula="sql-query that sums the Customer id usage in the referenced tables" />
。很好,因为它是一个快速的解决方案(至少与您的数据库一样快),无需额外的查询。不太好,因为它很容易受到架构更改的影响,因此当您更改数据库时,一定不要忘记更新此查询。
疯狂的解决方案:创建一个进行计算的模式绑定视图。当您需要时对其进行查询。很好,因为它受架构限制并且不太容易受到架构更改的影响;很好,因为查询速度很快;不太好,因为您仍然需要执行额外的查询(或者将此视图的结果映射到解决方案 4 上。)
2、3、4 也很好,因为您还可以将此行为投影到您的 UI(不允许删除)
就我个人而言,我会选择 4、3、5。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)