【问题标题】:LLBLGen Cascading Delete?LLBLGen 级联删除?
【发布时间】:2011-03-29 00:49:41
【问题描述】:

有没有什么简单的方法可以在 LLBLGen 中执行似乎最好描述为“级联删除”的操作?我正在寻找的一个例子:

你有这些表:

Customer:  
-Id

Order:  
-Id  
-CustomerId

OrderDetail:
-Id
-OrderId

现在,我想删除一个特定的客户和所有依赖于它的东西(它的所有订单,以及它的所有订单的订单详情)。由于如果我在删除具有其 Id 作为外键的订单之前删除客户,数据库将会出现问题,因此我几乎需要:

  1. 获得客户
  2. 获取客户的订单
  3. 获取每个订单的订单详情
  4. 删除每个 OrderDetail
  5. 删除每个订单
  6. 删除每个客户

现在,这似乎是一项非常常见的任务——我认为某处存在某种 Delete(Entity entityToDelete, bool isRecursive) 函数。无论如何,有什么简单的方法可以做到这一点?

【问题讨论】:

    标签: sql-server llblgenpro cascading-deletes llblgen


    【解决方案1】:

    不,LLBLGen Pro 不支持级联删除。由于以下原因,我们没有内置它: - 并不总是可以进行级联删除(想象一个菱形模型,其中两个/多个路径从 a 到 b。这也是为什么例如 sqlserver 并不总是执行 /allows 级联删除 - 在 target-per-entity 继承中,级联删除是不可能的。

    我们确实支持直接在数据库上进行批量删除。因此,您不必先获取所有要删除的实体。例如,要删除客户订单的所有订单详细信息,请在 orderdetails 上创建直接删除,在其中您指定为 filter 一个 fieldcompareset 谓词,您在其中指定基于 customerid 的订单过滤器。然后使用相同的谓词(没有连接)删除订单,然后删除客户。您可以将这些删除分组到一个工作单元中,以便更轻松地在事务中一次性运行它们。

    如果您对此感到困惑,请在我们的论坛上发帖提问:http://www.llblgen.com/tinyforum。我们很乐意为您提供帮助

    【讨论】:

    • 鉴于您实际上为 LLBLGen 工作,如果您能提供一些代码来展示如何做到这一点,那就太好了。
    • 作为旁注,我想指出“并不总是可以进行级联删除”并不是不实现该功能的理由。由于您正在创建一个商业 ORM 解决方案,因此明智的做法是通过实现该功能并在操作无法完成时引发运行时异常来让您的客户的生活更轻松。
    • 然后数据库抛出异常,这并不理想,因为它会给事务带来很多问题:您必须重新运行它们,可能以不同的顺序等,你必须在代码中,在运行时决定。级联删除也是“隐藏在幕后”执行的事情,这不是我们想做的事情。在过去 8 年的 LLBLGen Pro 上市后,我们学到了很多关于人们如何使用 ORM 的知识,我们知道最好不要“隐藏”,而是公开,因此手动批量删除。
    • 当您没有菱形模型的情况下,为您提供易于使用的机制仍然是有意义的。我仍然可以使用 LLBLGen 删除将失败的记录,因为它被用作另一个表中的外键。扩展您的论点,这意味着 LLBLGen 不应该支持任何类型的删除。如果我们作为开发人员尝试在“菱形”模型中对实体进行级联删除而不首先处理此问题,那是我们的错误。如果 LLBLGen 不能让我们轻松地做这样的基本事情,那么它就是产品的失败。
    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 2011-06-29
    • 2010-10-05
    • 2011-09-21
    • 2012-02-27
    • 2012-09-08
    • 2012-09-07
    • 2018-02-19
    相关资源
    最近更新 更多