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

 

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

Transactions Management and Entity Framework

Îåêßíçóå áðü ôï ìÝëïò xabikos. Τελευταία δημοσίευση από το μέλος baxevanis στις 24-12-2010, 02:57. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  21-12-2010, 23:51 61844

    Transactions Management and Entity Framework

    Είμαι σχετικά καινούριος στον επαγγελματικό κόσμο του development μιας και δουλεύω κάτι λιγότερο από δυο χρόνια και αυτή είναι η πρώτη μου δουλειά. Η αρχιτεκτονική που ακολουθούμε είναι η γνωστή με τα layers και αναπτύσσουμε Domain Model. Για το DAL χρησιμοποιούμε Nhibernate και όλο το Transaction Management γίνεται από το spring με Atributes πάνω στις μεθόδους των services. Αυτό αποδίδει πάρα πολύ καλά μιας και το Spring συνεργάζεται άψογα με το NHibernate. Αυτό που έχω σαν απορία και δεν έχω καταφέρει να βρω κάτι διαφορετικό είναι αν υπάρχει κάποια άλλη λύση με την ίδια λειτουργικότητα για να χρησιμοποιηθεί με το EF4. Μια λύση που έχω δει είναι να χρησιμοποιηθεί το TransactionScope αλλά δεν είναι τόσο ευέλεκτικο ή δεν το έχω καταλάβει τόσο καλά. Για να εξηγήσω: Πως θα μπορούσα με σχετικά εύκολο τρόπο όταν μέσα από μια μέθοδο που εκτελείται στα πλαίσια ενός Transaction καλείται μια άλλη μέθοδος που απαιτεί και αυτή Transaction να ελέγχονται από έναν κεντρικό μηχανισμό; Στο Spring υπάρχουν αρκετές υλοποιήσεις του TransactionManager που ελέγχει τις κλήσεις και έτσι το Transaction είτε πετυχαίνει είτε γίνει roll back όλο μαζί. Υπάρχει κάποια άλλη προσέγγιση στο θέμα;

    My dream is to fly over the rainbow so high!!!!
  •  22-12-2010, 11:13 61853 σε απάντηση της 61844

    Απ: Transactions Management and Entity Framework

    Το NHibernate και το Spring είναι πιο ώριμα προϊόντα από το  Entity Framework 4 ή με άλλα λόγια - έχουν πράγματα που ακόμα δεν έχουν περάσει στο EF. Όσον αφορά το Transaction Management θα πρέπει να διαχωρίσεις δύο τελείως διαφορετικές κατηγορίες. Άλλο το transaction management που αφορά τη βάση και άλλο, ΤΕΛΕΙΩΣ άλλο πράγμα είναι η διαχείριση long-running transactions από ένα container ή ORM, το οποίο περιστασιακά μόνο ακουμπάει τη βάση. 

    Στα database transactions τόσο το NHibernate όσο και το EF4 χρησιμοποιούν αναγκαστικά τους ίδιους μηχανισμούς που παρέχει το ADO.NET. Η διαφορά είναι ότι το NHibernate σε συνδυασμό με το Spring σου κρύβουν τη low-level υλοποίηση πίσω από τους δικούς τους μηχανισμούς. Βαθιά κάτω στο NHibernate και το Spring θα βρεις και TransactionScope και BeginTransaction εντολές. Το Entity Framework από μόνο του δεν σου δίνει κάτι διαφορετικό από το TransactionScope.
    Εδώ που τα λέμε, ούτε το NHibernate από μόνο του σου δίνει κάτι φοβερά πιο προχωρημένο, απλά συνεργάζεται καλά με τους διάφορους containers για να σου δώσει εξυπνότερη διαχείριση transactions. Εκεί που υπάρχει μεγαλύτερη διαφορά είναι στο object state management, όπου το EF4 σου δίνει λιγότερες λειτουργίες μέσω του 

    Τα transactions που σου δίνει κάποιος container είναι διαφορετικά. Ελέγχουν τη διάρκεια ζωής των αντικειμένων στη μνήμη ανεξάρτητα από τα database transactions τα οποία μπορεί να υπάρχουν, μπορεί και όχι. Ο container είναι αυτός ο οποίος σου δίνει το transaction management μέσω attributes ή aspects, το Dependency Injection και τα συμπαραμαρτούντα. Το EF ή το NHibernate δεν σου τα δίνουν αυτά. Ο container σου δίνει πολλά άλλα services και η αντικατάσταση του θα προκαλέσει πολύ περισσότερες και σοβαρότερες αλλαγές στην εφαρμογή σου απ' ότι η αλλαγή του ORM.
    Μπορείς να επιλέξεις οποιοδήποτε container (Spring.NET, Enterprise Library Unity, MEF ίσως), απλά θα πρέπει να κάνεις κάποια χειροκίνητα βήματα σε κάθε περίπτωση για να εξασφαλίσεις τη συνεργασία μεταξύ EF και container. Για παράδειγμα, αυτό το blog post περιγράφει πως να χρησιμοποιήσεις Spring.NET και EF. Τέλος, θα πρέπει να ελέγξεις αν και πως σου παρέχει ο κάθε container τα services που θέλεις, και ποιά θα πρέπει να κάνεις χειροκίνητα.

    Αλήθεια, γιατί θέλεις να αλλάξεις το NHibernate + Spring.NET με EF + κατιτί? Είναι κάτι που σου λείπει ή είναι ακαδημαϊκή η ερώτηση?

    Υ.Γ. Επειδή ανέφερες κι εσύ "services" και είμαι 100% σίγουρος ότι κάποιοι θα μπερδευτούν, υποθέτω ότι δεν μιλάς για Web ή WCF Services. Όταν κάνεις expose ένα Web/WCF Service μπορείς να ορίσεις μέσω attributes πολλά χαρακτηριστικά του lifecycle και transaction management μόνο που ... τα αντικείμενα που δημιουργούνται είναι βαριά και πρέπει αναγκαστικά να τα καλέσεις μέσω του WCF. Όταν μιλάμε για Spring.NET μιλάμε για κλήσεις και lifecycle μέσα στην ίδια την εφαρμογή. 
    Εκτός και αν η ιδέα "σπάσε την εφαρμογή σου σε WCF services" δεν σε γεμίζει με τρόμο ....

    Υ.Υ.Γ Ωραία ερώτηση! Και ξεκίνησες να δουλεύεις απευθείας με NH και Spring ? Τυχερέ, ά ρε τυχερέ!

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  22-12-2010, 15:22 61869 σε απάντηση της 61853

    Απ: Transactions Management and Entity Framework

    Σαφώς και έπρεπε να ξεκαθαρίσω πως αυτό που με ενδιαφέρει είναι τα long-running transactions ή όπως τα λέει το NHibernate conversations. Γενικά αυτό που θέλω το κατάλαβες ακριβώς. Μιλάω για κάποιον container που κάνει αυτός το transaction management και μου φαίνεται αρκετά περίεργο που δεν έχει υλοποιηθεί κάτι τέτοιο από κάποιο άλλο framework εκτός του Spring μιας και είναι από τα βασικά προβλήματα που πρέπει να λυθούν σε μια εφαρμογή.

    Όσο για τα database transactions έχεις απόλυτο δίκαιο μιας και το NHibernate δουλεύει και αυτό με το ADO.NET και σου παρέχει κάποιες δυνατότητες παραπάνω από το EF αλλά είναι λίγο πιο δύσκολο στην εκμάθηση ίσως. Βέβαια τώρα που το τρέχει αρκετά η MS το Entity Framework δεν θα αργήσει να παρέχει εξίσου ωραία πράγματα.

    Για τους containers τώρα εκεί είναι που το Spring είναι πραγματικά πολύ καλό και σου προσφέρει πάρα πολλές δυνατότητες χωρίς να είναι ιδιαίτερα δύσκολο στην εκμάθηση. Ο μηχανισμός για τα transactions management είναι φοβερός και το καλύτερο είναι πως δεν έχει σχέση με τι θα κάνεις την πρόσβαση στην βάση. Μπορείς να χρησιμοποιήσεις είτε NHibernate είτε ADO.NET και το ενσωματωμένο AdoDao που παρέχει. Σίγουρα αυτό που θα είχε ενδιαφέρον είναι να δοκιμάσω ένα integration μεταξύ του Spring και του EF σύμφωνα και με το πολύ καλό blog post που μου έδωσες.

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

    Υ.Γ. Όπως πολύ σωστά κατάλαβες δεν αναφέρομαι σε Web ή WCF services αλλά σε "business services" που υλοποιούν τις διάφορες λειτουργίες και εκτελούνται μέσα στην εφαρμογή.

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

    My dream is to fly over the rainbow so high!!!!
  •  24-12-2010, 02:57 61902 σε απάντηση της 61869

    Απ: Transactions Management and Entity Framework

    Χωρίς να γνωρίζω εάν είναι Web η εφαρμογή πάνω στην οποιά δουλεύεις, πρoτείνω να ρίξεις και μια ματιά στο NHibernate.Burrow και στους τρόπους με τους οποίους εκτελεί τα Conversations. Μαζί με τα υπόλοιπα nhibernate-contrib projects θα το βρείς εδώ.
    http://nikosbaxevanis.com
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems