Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework 4 very slow linking an Order to Customer who has 10,000 orders

This one has me stumped.

I have a Customer and Order entity. the Customer can have many Orders.

Where the Customer has 10,000 orders when I create a new Order and set the Customer property (Order.Customer = customer) there is a LONG delay (20s of seconds). It appears that the context is loading all 10,000 orders before adding this new one.

I am not currently using FKs directly which I suspect may help.

Any ideas how I can improve matters without a massive refactor?

Cheers.

like image 991
Mark Chidlow Avatar asked Dec 27 '22 18:12

Mark Chidlow


2 Answers

The problem is most probably that you are using T4 POCO template. This template generates nasty fixup methods and use them internally in all navigation properties. If you modify navigation property on one side it triggers fixup which will try to modify reverse navigation property to make the object graph consistent. And here comes the problem. Once you assign Customer property to the Order instance it will fixup Orders property on the Customer instance but fixup access property as any other code and triggers lazy loading of all customer's orders.

There are only few solutions:

  • Use Foreign key relation ship and set FK property. That should work for inserts but for update it can still cause problems because setting FK property to another value will set null to navigation property and that will again trigger fixup for previous parent.
  • Turn off lazy loading for this operation - you most probably doesn't need it to create new order.
  • Modify template and remove fixupus
like image 173
Ladislav Mrnka Avatar answered Apr 19 '23 20:04

Ladislav Mrnka


Maybe a different approach might work. When you have a customer instance try:

customer.Orders.Add(new Order(){parameter1 = value1, parameter2=valu2, etc.})

Am not @work right now so don't have any code by hand to check entity structure (work with Self-tracking entities for a project) to see if this makes sense. But by adding it to the collection of Orders the entity might resolve the relation between order and customer without getting all the other 10k orders of this specific customer.

like image 27
Bernoulli IT Avatar answered Apr 19 '23 19:04

Bernoulli IT