Είναι εντελώς λάθος να χρησιμοποιήσεις ένα ORM για batch updates γενικά, πόσο μάλλον όταν μιλάς για πολλές εγγραφές. Τα ORM υπάρχουν για να μπορείς να χρησιμοποιήσεις αντικείμενα με συγκεκριμένη συμπεριφορά στην εφαρμογή σου χωρίς να ασχολείσαι πως θα τα φορτώσεις από τη βάση. Εσύ όμως θέλεις απλά να πειράξεις πεδία στη βάση - δεν υπάρχει κανένα είδος συμπεριφοράς αντικειμένου εδώ. Για την ακρίβεια, δεν υπάρχουν καν αντικείμενα, μόνο πεδία κάποιου πίνακα.
Είναι επίσης λάθος να χρησιμοποιήσεις ADO.NET ή οποιαδήποτε άλλη client τεχνολογία. Για ποιό λόγο θα πρέπει να μεταφέρεις 5000000 εγγραφές στον client όταν θέλεις μόνο να κάνεις update στον server? Σκέψου μόνο πόσο κοστίζει η μεταφορά τόσων εγγραφών από το server στον client και μετά πάλι πίσω. Το αποτέλεσμα θα είναι να κρατήσει η διαδικασία πολύ περισσότερο απ' ότι περίμενες (μιλάμε για τάξεις μεγέθους), με πολύ μεγάλη πιθανότητα (~100%) να διακοπεί λόγω concurrency violations αν κάποιος άλλος κάνει updates στον πίνακα.
Η μόνη σωστή λύση εδώ είναι να χρησιμοποιήσεις SQL κώδικα για να κάνεις το batch update απευθείας στη βάση. Ακόμα και έτσι, θα πρέπει να προσέξεις πως θα κάνεις ένα τόσο μεγάλο update, καθώς τα κλειδώματα που θα γίνουν στη βάση θα κρατήσουν για πολλή ώρα με αποτέλεσμα να δημιουργήσεις πρόβλημα σε οποιονδήποτε άλλο χρησιμοποιεί τη βάση σου. Επιπλέον, μία τέτοια μαζική αλλαγή θα δημιουργήσει πολλές εγγραφές στο transaction log.
Τέλος, θα πρέπει να σκεφτείς ΓΙΑΤΙ χρειάζονται τόσο πολλά updates? Μία τέτοια απαίτηση συνήθως κρύβει κάποιο σχεδιαστικό λάθος. Τί είναι τα πεδία που θέλεις να αλλάξεις? Μήπως πρόκειται για λίγες τιμές οι οποίες θα έπρεπε να βρίσκονται σε ένα άλλο πίνακα αντί να επαναλαμβάνονται σε κάθε γραμμή?
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos