Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Ελαχιστοποίηση κύκλου ζωής ενός LINQ to SQL DataContext

Îåêßíçóå áðü ôï ìÝëïò pontifikas. Τελευταία δημοσίευση από το μέλος George Parissis στις 02-08-2011, 16:46. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-08-2011, 13:17 66728

    Ελαχιστοποίηση κύκλου ζωής ενός LINQ to SQL DataContext

    Παντού διαβάζουμε ότι τα DataContext δεν προτείνεται να έχουν διάρκεια ζωής περισσότερο από ... δευτερόλεπτα. 
    Τους τελευταίους μήνες εργάστηκα σε μια εφαρμογή όπου για λόγους χρόνου, συστηματικά παρέβησα την συμβουλή αυτή. Έχοντας
    λάβει όμως badget για δημιουργία 2ης έκδοσης, θα ήθελα να προσπαθήσω να δω πώς μπορώ να την ακολουθήσω.

    Το σενάριο που με αναγκάζει να διατηρώ ανοικτό το DC μου για αρκετή ώρα είναι το ακόλουθο:
    Διαχειρίζομαι φόρμες συντήρησης εγγραφών. Οπότε επιλέγοντας μια εγγραφή από τις διαθέσιμες πρέπει να μπορώ να δω και να μεταβάλλω ό,τι κρέμμεται 
    από αυτήν. Έτσι μπορώ να αλλάζω τα properties της εγγραφής αλλά, να προσθέτω συσχετήσεις με άλλες εγγραφές (μέσα από κάποιο Grid, στην ίδια φόρμα), 
    να διαγράφω παλαιές συσχετίσεις ή κάποια από αυτές που μόλις προσέθεσα και ακόμα δεν έχω κάνει persist.
    Επίσης συμβαίνει στην ίδα φόρμα, να διαχειρίζομαι συσχετίσεις πολλάπλών επιπέδων (π.χ. Α<-(1:*)->B<-(1:*)->C).
    Φυσικά όλες αυτές οι αλλαγές θα πρέπει να γίνουν persist όταν ο χρήστης αποφασίσει, και αν (μπορεί να κάνει undo).

    Αυτό που μέχρι τώρα κάνω είναι να έχω ένα κέντρικό DC για την Φόρμα από το οποίο σε πρώτη φάση εμπλουτίζω τα Grids των εγγραφών μου
    και παραμένει ενεργό μέχρι να γίνει κάποιο SubmitChanges οπότε και το κάνω Refresh.
    Αν την ώρα που πάω να κάνω SubmitChanges συμβεί κάποιο conflict, έχω γράψει έναν generic μηχανισμό που ανάλογα με το είδος του conflict, 
    και σε συνεργασία με τον χρήστη, αποφασίζει για το αν θα κάνει Replace ή undo.

    Ο άλλος τρόπος που σκέφτομαι (και ίσως από άγνοια κάνω λάθος) είναι να δουλέψω με collections αντικειμένων. Αυτό όμως προϋποθέτει ότι θα πρέπει να έχω κάνει pre-cache μεγάλο
    όγκο δεδομένων, χωρίς απαραίτητα να αποφεύγω τα conflicts. 
    Πώς είναι δυνατό να κάνω χρήση του DC μόνο στο Load και στα Delete-Update-Insert και στο ενδιάμεσο να δουλεψω αποδοτικά μόνο με collections? 
    Ή μήπως υπάρχει άλλος τρόπος?

    Ευχαριστώ.

  •  02-08-2011, 15:05 66729 σε απάντηση της 66728

    Απ: Ελαχιστοποίηση κύκλου ζωής ενός LINQ DataContext

    Επειδή ανέφερες σκέτο LINQ να θεωρήσω ότι χρησιμοποιείς Linq To SQL ή Entity Framework;

    Αν χρησιμοποιείς EF τότε μπορείς να πας στα STE (Self Tracking Entities). Το EF σου δημιουργεί POCO classes που μπορούν να παρακολουθούν τις αλλαγές που έχουν γίνει σε αυτά, οπότε όταν τα βάλεις σε ένα Context που θα δημιουργήσεις εκείνη την στιγμή (με την εντολή ApplyChanges) τότε θα μπορεί το context να φτιάξει τα SQL Queries που χρειάζονται και έτσι μετά το SaveChanges να το κάνεις dispose.

    Αν από την άλλη χρησιμοποιείς Linq To SQL δεν ξέρω να σου προτείνω κάτι. Η Microsoft αν και επίσημα το υποστηρίζει, ότι καινούριο βγάζει στον τομέα DataAccess το ενσωματώνει στο EF.

  •  02-08-2011, 16:13 66730 σε απάντηση της 66729

    Απ: Ελαχιστοποίηση κύκλου ζωής ενός LINQ DataContext

    Ναι, αναφέρομαι σε LINQ to SQL. 
    Για να είμαι ειλικρινής, δεν ήξερα για το LINQ to Entities.
    Όταν αναφέρεσαι σε self tracking εννοείς ότι το αντικείμενο αποθηκεύει Log των ενεργειών που έχουν γίνει πάνω σε αυτό και δίνει το log στο context για να 
    γίνουν generate τα κατάλληλα queries?
  •  02-08-2011, 16:46 66731 σε απάντηση της 66730

    Απ: Ελαχιστοποίηση κύκλου ζωής ενός LINQ DataContext

    Ακριβώς αυτό κάνουν τα STE (Self Tracking Entities).

    Όμως είναι διαθέσιμα μόνο για το Entity Framework οπότε δυστυχώς θα πρέπει να αλλάξεις Framework. Linq To SQL & Entity Framework δεν έχουν πολλές διαφορές, ίσως κάποια Linq Extensions να υπάρχουν στο ένα και όχι στο άλλο αλλά σε γενικές γραμμές βασίζονται στα ίδια πράγματα.

     

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems