Προγραμματισμός

Τρόπος χειρισμού συγκρούσεων ταυτότητας στο Entity Framework

Ο χειρισμός ταυτότητας μπορεί να χρησιμοποιηθεί για τη διατήρηση της ακεραιότητας των δεδομένων και της συνοχής των δεδομένων όταν πολλοί χρήστες έχουν πρόσβαση στον ίδιο πόρο ταυτόχρονα. Οι παραβιάσεις ταυτότητας μπορεί να προκύψουν όταν έχετε αλληλεξαρτώμενες συναλλαγές, δηλαδή συναλλαγές που εξαρτώνται η μία από την άλλη και προσπαθείτε να αποκτήσετε πρόσβαση στον ίδιο πόρο.

Αντιμετώπιση συγκρούσεων ταυτότητας στο Entity Framework

Ας καταλάβουμε τώρα πώς λειτουργούν όλες αυτές οι στρατηγικές στο Entity Framework. Στην απαισιόδοξη ταυτόχρονη, όταν ενημερώνεται μια συγκεκριμένη εγγραφή, όλες οι άλλες ταυτόχρονες ενημερώσεις στην ίδια εγγραφή θα τεθούν σε αναμονή έως ότου ολοκληρωθεί η τρέχουσα λειτουργία και ο έλεγχος παραιτηθεί πίσω έτσι ώστε να μπορούν να συνεχιστούν άλλες ταυτόχρονες λειτουργίες. Στην κατάσταση αισιόδοξης ταυτόχρονης ταυτότητας, η τελευταία αποθηκευμένη εγγραφή, "κερδίζει". Σε αυτήν τη λειτουργία, θεωρείται ότι οι συγκρούσεις πόρων λόγω ταυτόχρονης πρόσβασης σε κοινόχρηστο πόρο είναι απίθανες, αλλά, όχι αδύνατες.

Παρεμπιπτόντως, το Entity Framework παρέχει υποστήριξη από προεπιλογή για αισιόδοξη συνάφεια. Το Entity Framework δεν παρέχει υποστήριξη για απαισιόδοξη ταυτόχρονη συνάφεια. Ας καταλάβουμε τώρα πώς το Entity Framework επιλύει τις συγκρούσεις ταυτόχρονης ταυτότητας όταν εργάζεστε με την αισιόδοξη ταυτόχρονη (προεπιλεγμένη λειτουργία).

Όταν εργάζεστε με αισιόδοξη λειτουργία διαχείρισης ταυτόχρονων, συνήθως θα θέλετε να αποθηκεύσετε δεδομένα στη βάση δεδομένων σας, υποθέτοντας ότι τα δεδομένα δεν έχουν αλλάξει από τη στιγμή που φορτώθηκαν στη μνήμη. Σημειώστε ότι όταν προσπαθείτε να αποθηκεύσετε αλλαγές στη βάση δεδομένων χρησιμοποιώντας τη μέθοδο SaveChanges στην παρουσία περιβάλλοντος δεδομένων σας, θα εμφανιστεί ένα DbUpdateConcurrencyException. Ας καταλάβουμε τώρα πώς μπορούμε να το διορθώσουμε.

Για να ελέγξετε εάν υπάρχει παράβαση ταυτότητας, μπορείτε να συμπεριλάβετε ένα πεδίο στην κατηγορία οντοτήτων σας και να το επισημάνετε χρησιμοποιώντας το χαρακτηριστικό Timestamp. Ανατρέξτε στην κατηγορία οντοτήτων που δίνεται παρακάτω.

δημόσια τάξη Συγγραφέας

   {

δημόσιο αναγνωριστικό Int32 {get; σειρά; }

δημόσια συμβολοσειρά FirstName {get; σειρά; }

δημόσια συμβολοσειρά LastName {get; σειρά; }

δημόσια συμβολοσειρά Διεύθυνση {get; σειρά; }

[Χρονική σήμανση]

δημόσιο byte [] RowVersion {get; σειρά; }

   }

Τώρα, το Entity Framework υποστηρίζει δύο τρόπους ταυτόχρονης λειτουργίας: Καμία και Διορθωμένη. Ενώ το πρώτο υποδηλώνει ότι δεν θα πραγματοποιηθούν έλεγχοι ταυτότητας κατά την ενημέρωση της οντότητας, ο τελευταίος υπονοεί ότι η αρχική τιμή της ιδιοκτησίας θα ληφθεί υπόψη κατά την εκτέλεση ρητρών WHERE τη στιγμή που γίνονται ενημερώσεις ή διαγραφές δεδομένων. Εάν έχετε μια ιδιότητα που έχει επισημανθεί χρησιμοποιώντας τη χρονική σήμανση, η λειτουργία ταυτότητας θεωρείται ως Διορθωμένη, η οποία με τη σειρά της υποδηλώνει ότι η αρχική τιμή της ιδιότητας θα ληφθεί υπόψη στη ρήτρα WHERE για τυχόν ενημερώσεις ή διαγραφές δεδομένων για τη συγκεκριμένη οντότητα.

Για να επιλύσετε αισιόδοξες συγκρούσεις ταυτότητας, μπορείτε να επωφεληθείτε από τη μέθοδο Reload για να ενημερώσετε τις τρέχουσες τιμές στην οντότητά σας που βρίσκονται στη μνήμη με τις πρόσφατες τιμές στη βάση δεδομένων. Μόλις φορτωθεί ξανά με τα ενημερωμένα δεδομένα, μπορείτε να επιχειρήσετε να διατηρήσετε ξανά την οντότητά σας στη βάση δεδομένων. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορεί να επιτευχθεί αυτό.

χρησιμοποιώντας (var dbContext = νέο IDBDataContext ())

{

Συγγραφέας = dbContext.Authors.Find (12);

author.Address = "Χαϊντεραμπάντ, Telengana, ΙΝΔΙΑ";

δοκιμάστε

         {

dbContext.SaveChanges ();

         }

catch (DbUpdateConcurrencyException ex)

         {

ex.Entries.Single (). Επαναφόρτωση ();

dbContext.SaveChanges ();

         }

}

Σημειώστε ότι μπορείτε να χρησιμοποιήσετε τη μέθοδο Entries στην παρουσία DbUpdateConcurrencyException για να ανακτήσετε τη λίστα των παρουσιών DbEntityEntry που αντιστοιχούν στις οντότητες που δεν ήταν δυνατό να ενημερωθούν όταν κλήθηκε μια μέθοδος SaveChanges για να διατηρήσει τις οντότητες στη βάση δεδομένων.

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

δοκιμάστε

{

dbContext.SaveChanges ();

}

catch (DbUpdateConcurrencyException ex)

{

var data = ex.Entries.Single ();

data.OriginalValues.SetValues ​​(data.GetDatabaseValues ​​());

}

Μπορείτε επίσης να ελέγξετε εάν η οντότητα που προσπαθείτε να ενημερώσετε έχει ήδη διαγραφεί από άλλο χρήστη ή, έχει ήδη ενημερωθεί από άλλο χρήστη. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να το κάνετε αυτό.

catch (DbUpdateConcurrencyException ex)

{

var entity = ex.Entries.Single (). GetDatabaseValues ​​();

εάν (οντότητα == null)

   {

Console.WriteLine ("Η οντότητα που ενημερώνεται έχει ήδη διαγραφεί από άλλο χρήστη ...");

   }

αλλού

   {

Console.WriteLine ("Η οντότητα που ενημερώνεται έχει ήδη ενημερωθεί από άλλο χρήστη ...");

   }

}

Εάν ο πίνακας της βάσης δεδομένων σας δεν έχει μια στήλη χρονικής σήμανσης ή σειρά, μπορείτε να επωφεληθείτε από το χαρακτηριστικό ConcurrencyCheck για να εντοπίσετε συγκρούσεις ταυτότητας κατά τη χρήση του Entity Framework. Δείτε πώς χρησιμοποιείται αυτή η ιδιότητα.

[Πίνακας ("Συγγραφείς"]

δημόσια τάξη Συγγραφέας

{

δημόσιος συγγραφέας () {}

[Κλειδί]

δημόσιο int Id {get; σειρά; }

[Έλεγχος ταυτότητας]

δημόσια συμβολοσειρά FirstName {get; σειρά; }

δημόσια συμβολοσειρά LastName {get; σειρά; }

δημόσια συμβολοσειρά Διεύθυνση {get; σειρά; }

}

Στην πράξη, ο SQL Server θα συμπεριλάμβανε αυτόματα το AuthorName κατά την εκτέλεση ενημέρωσης ή διαγραφής δηλώσεων στη βάση δεδομένων.

$config[zx-auto] not found$config[zx-overlay] not found