gpt4 book ai didi

nhibernate - 如何判断一个引用的对象是否可以删除?

转载 作者:行者123 更新时间:2023-12-02 22:56:49 25 4
gpt4 key购买 nike

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

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

Nhibernate 可以做到这一点吗?

最佳答案

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

  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. 疯狂的解决方案:创建一个进行计算的模式绑定(bind) View 。当您需要时对其进行查询。很好,因为它受架构限制并且不太容易受到架构更改的影响;很好,因为查询很快;不太好,因为您仍然需要执行额外的查询(或者将此 View 的结果映射到解决方案 4 上。)

2、3、4 也很好,因为您还可以将此行为投影到您的 UI(不允许删除)

就我个人而言,我会选择 4、3、5 来满足这种偏好

关于nhibernate - 如何判断一个引用的对象是否可以删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2294669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com