Διαδρομές
/
C#
C#
/
Ασκήσεις
/
Αντικειμενοσχεσιακή αντιστοίχιση
Αντικειμενοσχεσιακή αντιστοίχιση

Αντικειμενοσχεσιακή αντιστοίχιση

Άσκηση εκμάθησης

Εισαγωγή

Καθαρισμός πόρων

Αν μια κλάση υλοποιεί τη διεπαφή IDisposable, τότε η μέθοδος Dispose() της πρέπει να καλείται όποτε ένα στιγμιότυπο δεν χρειάζεται πια. Αυτό γίνεται συνήθως από μια ρήτρα catch ή finally ή από τη ρουτίνα Dispose() κάποιου καλούντος. Το Dispose() δίνει την ευκαιρία να απελευθερωθούν μη διαχειριζόμενοι πόροι, όπως αντικείμενα του λειτουργικού συστήματος (τα οποία δεν διαχειρίζεται το runtime του .NET), και να επαναφερθεί η εσωτερική κατάσταση των διαχειριζόμενων πόρων.

Οδηγίες

Υλοποιείς ένα σύστημα ORM (αντιστοίχιση αντικειμένων σε σχεσιακές δομές) πάνω σε μια βάση δεδομένων που σου έχει δώσει μια άλλη ομάδα.

Η βάση δεδομένων μπορεί να χειριστεί μία μόνο συναλλαγή κάθε φορά.

Δεν απαιτείται καταγραφή ή άλλος χειρισμός σφαλμάτων σε αυτό το στάδιο.

Σημείωσε ότι, εσωτερικά, η βάση δεδομένων περνά από μια σειρά καταστάσεων: Closed, TransactionStarted, DataWritten, Invalid, Closed. Μπορείς να βασιστείς στο γεγονός ότι η βάση δεδομένων βρίσκεται σε κατάσταση Closed στην αρχή κάθε άσκησης.

Η βάση δεδομένων έχει τις εξής μεθόδους στιγμιοτύπου:

  • Η Database.BeginTransaction() ξεκινά μια συναλλαγή στη βάση δεδομένων. Αν κληθεί όταν η βάση δεδομένων δεν βρίσκεται σε κατάσταση Closed, τότε πετάγεται μια εξαίρεση. Αν πετύχει, η εσωτερική κατάσταση της βάσης δεδομένων αλλάζει σε TransactionStarted.
  • Η Database.Write(string data) γράφει δεδομένα στη βάση δεδομένων μέσα στη συναλλαγή. Αν λάβει λανθασμένα δεδομένα, θα πεταχτεί μια εξαίρεση. Μια προσπάθεια κλήσης αυτής της μεθόδου χωρίς να έχει κληθεί η BeginTransaction() θα προκαλέσει εξαίρεση. Αν πετύχει, η εσωτερική κατάσταση της βάσης δεδομένων αλλάζει σε DataWritten.
  • Η Database.EndTransaction() καταχωρίζει οριστικά τη συναλλαγή στη βάση δεδομένων. Μπορεί να πετάξει μια εξαίρεση αν δεν μπορεί να κλείσει τη συναλλαγή ή αν δεν έχει κληθεί η Database.BeginTransaction().
  • Μια κλήση στη Database.Dispose() θα καθαρίσει τη βάση δεδομένων αν πεταχτεί μια εξαίρεση κατά τη διάρκεια μιας συναλλαγής. Αυτό αλλάζει την κατάσταση της βάσης δεδομένων σε Closed.

Η κατάσταση της βάσης δεδομένων είναι προσβάσιμη μέσω του database.DbState.

Η κατάσταση της βάσης δεδομένων μπορεί να οριστεί σε μία από τις εξής:

  • TransactionStarted
  • DataWritten
  • Invalid
  • Closed

1. Ξεκίνα μια συναλλαγή

Υλοποίησε τη μέθοδο Orm.Begin() για να ξεκινήσεις μια συναλλαγή στη βάση δεδομένων. Αν η βάση δεδομένων δεν ξεκινά με εσωτερική κατάσταση State.Closed, τότε πετάει μια InvalidOperationException.

var orm = new Orm(new Database());
orm.Begin();
// => database has an internal state of State.TransactionStarted

2. Γράψε δεδομένα στη βάση δεδομένων

Υλοποίησε τη μέθοδο Orm.Write() για να γράψεις δεδομένα στη βάση δεδομένων. Αν η βάση δεδομένων δεν ξεκινά με εσωτερική κατάσταση State.TransactionStarted ή αν γραφτούν λανθασμένα δεδομένα, τότε πετάγεται μια InvalidOperationException. Αν η εγγραφή αποτύχει, τότε το Orm πρέπει να καθαρίσει τη βάση δεδομένων.

var orm = new Orm(new Database());
orm.Begin();
orm.Write("some data");
// => database has an internal state of State.DataWritten
orm.Write("bad write");
// => database has an internal state of State.Closed

3. Καταχώρισε οριστικά τα προηγουμένως γραμμένα δεδομένα στη βάση δεδομένων

Υλοποίησε τη μέθοδο Orm.Commit() για να καταχωρίσεις οριστικά τα δεδομένα. Αν η καταχώριση αποτύχει, καθάρισε τη βάση δεδομένων. Αν η βάση δεδομένων δεν ξεκινά με εσωτερική κατάσταση State.DataWritten, τότε πετάγεται μια InvalidOperationException.

var orm = new Orm(new Database());
orm.Begin();
orm.Write("some data");
orm.Commit();
// => database has an internal state of State.Closed
orm.Begin();
orm.Write("bad commit");
orm.Commit();
// => database has an internal state of State.Closed

4. Βεβαιώσου ότι η βάση δεδομένων καθαρίζεται σωστά αν το ORM πρέπει να κλείσει στη μέση μιας συναλλαγής.

Υλοποίησε τη διεπαφή IDisposable στην κλάση Orm. Η κλήση είναι εγγυημένο ότι θα πετύχει.

var db = new Database();
var orm = new Orm(db);
orm.Begin();
orm.Write("some data");
orm.Dispose();
// => database has an internal state of State.Closed
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
C# Exercism

Έτοιμος να ξεκινήσεις την άσκηση Αντικειμενοσχεσιακή αντιστοίχιση;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις C# με 62 έννοιες178 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.