2

Is there any easy way to do what seems best described as a "Cascading Delete" in LLBLGen? An example of what I'm looking for:

You've got these tables:

Customer:  
-Id

Order:  
-Id  
-CustomerId

OrderDetail:
-Id
-OrderId

Now, I want to delete a specific Customer and all the things that depend on it (all its orders, and all its orders' orderdetails). Since the database is going to throw a fit if I delete a Customer before deleting the Orders that have its Id as a foreign key, I need to pretty much:

  1. Get the customer
  2. Get the customer's Orders
  3. Get each Orders' OrderDetails
  4. Delete each OrderDetail
  5. Delete each Order
  6. Delete each customer

Now, this seems like a pretty common task- I'd think there's be some sort of Delete(Entity entityToDelete, bool isRecursive) function somewhere. Anyway, is there any easy way to do this?

Fishtoaster
  • 1,809
  • 2
  • 20
  • 36

1 Answers1

4

No, LLBLGen Pro doesn't support cascading deletes. We didn't build this in for the following reasons: - it's not always possible to do cascading deletes (imagine a diamond shaped model, where two / more paths lead from a to b. This is also why for example sqlserver not always performs /allows cascade deletes - in target-per-entity inheritance, cascade deletes is not possible.

We do support bulk deletes directly on the db. So you don't have to fetch all entities to delete first. For example, to delete all order details for the orders for the customer, create a direct delete on orderdetails where you specify as filter a fieldcompareset predicate where you specify a filter on order based on the customerid in order. Then delete the orders using the same predicate (without the join), and then delete the customer. You can group these deletes in a unit of work to run them in 1 go in a transaction easier.

If you get stuck with this, please post a question on our forums: http://www.llblgen.com/tinyforum .We're happy to help you

Frans Bouma
  • 8,259
  • 1
  • 27
  • 28
  • Given you actually work for LLBLGen it would have been nice if you could have supplied some code to show how to do this. – Mark Aug 23 '11 at 12:36
  • As as side note I'd like to point out that "it's not always possible to do cascading deletes" isn't much of an argument for not implementing the feature. Since you're creating a commercial ORM solution the sensible thing to do would be to make your customer's life's easier by implementing the feature and throwing a run-time exception when the operation cannot complete. – Mark Aug 23 '11 at 12:39
  • 1
    The exception is then thrown by the DB, which isn't ideal, as it will cause a lot of problems for transactions: you have to re-run them, probably in a different order etc., and you have to decide that in code, at runtime. Cascading deletes are also something that is executed 'hidden behind the scenes', which isn't something we'd like to do. In the past 8 years LLBLGen Pro is now on the market, we have learned a lot about how people use ORMs, and we know it's best not to do things 'hidden', but out in the open, hence the manual bulk deletes. – Frans Bouma Aug 25 '11 at 08:04
  • 1
    It still makes sense for you to provide an easy to use mechanism for the cases when you don't have the diamond shaped model. I can still use LLBLGen to delete a record which will fail cause it is used as a foreign key in another table. Extending your argument that means LLBLGen shouldn't support any sort of deleting. If we as developers try to do a cascading delete on an entity in a "diamond" model without taking care of this issue first that's our mistake. If LLBLGen doesn't make it easy for us to do fundamental things like this easily its a failing in the product. – Mark Aug 25 '11 at 12:12