Το 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