Η χρήση του NHibernate και οποιουδήποτε ORM δεν σε απαλλάσσει από το να μάθεις SQL, το αντίθετο μάλιστα. Πρέπει να ξέρεις καλά SQL και τη βάση σου για να μπορέσεις να ελέγξεις ότι τα SQL statements που δημιουργούνται από τα query σου δεν έχουν πρόβλημα, να δημιουργήσεις τα κατάλληλα indexes αλλά και για να υλοποιήσεις reporting queries ή άλλα μυστήρια τα οποία απλά δεν γίνονται με ORM. Με δεδομένο ότι τα "εύκολα" queries τα κάνει το ORM, σου μένουν τα δύσκολα queries. Άσε που ένα καλό object model συνήθως δεν οδηγεί σε ένα καλό database schema.
Όσον αφορά τώρα το migration, εύκολη λύση δεν υπάρχει. Ο λόγος είναι ότι δεν αρκεί να αλλάξεις το σχήμα, αλλά πρέπει να κάνεις κάτι με τα δεδομένα. Τα πράγματα είναι σχετικά απλά αν προσθέτεις νέα πεδία (απλά τα βάζεις null ή default), αλλά περιπλέκονται όταν π.χ. σπας ένα πεδίο σε δύο, ή διαγράφεις ένα πεδίο. Τί κάνεις τότε? Γενική λύση δεν υπάρχει.
Γενικά, όταν δημιουργείς μία νέα έκδοση της βάσης δεδομένων πρέπει να δημιουργήσεις και τα αντίστοιχα sql scripts για να αλλάξεις το σχήμα. Για τις εύκολες περιπτώσεις, μπορείς χρησιμοποιήσεις κάποιο εργαλείο όπως το SQL Compare και το SQL Data Compare για να δημιουργήσεις τα update scripts αλλά για τις δύσκολες περιπτώσεις θα πρέπει να γράψεις τον κώδικα εσύ.
Αν θέλεις να δουλέψεις μόνο με κώδικα, το NHibernate σου δίνει μία μικρή βοήθεια, καθώς μπορείς να δημιουργήσεις μία νέα βάση με την κλάση NHibernate.Tool.hbm2ddl.SchemaExport. Μετά μπορείς να μεταφέρεις με κώδικα τα δεδομένα από την παλιά βάση στη νέα βάση. Η διαδικασία αυτή όμως θα είναι σίγουρα αργή. Το Hibernate έχει κλάσεις για να κάνει migration ενός σχήματος, το NHibernate όμως όχι. Το γεγονός πάντως ότι υπάρχει και κεντρική βάση κάνει τα πράγματα πιο περίπλοκα, καθώς θα πρέπει να κάνεις update και τις δύο βάσεις.
Έχω μία απορία πάντως. Απ' όσα περιγράφεις υποθέτω ότι θέλεις οι clients να δουλεύουν disconnected, γι αυτό έχεις μία κεντρική βάση SQL Express ή παραπάνω και μεταφέρεις όταν χρειάζεται τα δεδομένα της στους clients με replication? Ή κάτι άλλο? Σε κάθε περίπτωση, θα πρέπει να αλλάξουν με τη μία το σχήμα της κεντρικής βάσης, των clients αλλά και τα replication scripts όταν υπάρχουν αλλαγές στα πεδία. Αν δεν θέλεις όμως να δουλεύεις σε disconnected mode θα ήταν πάρα πολύ ευκολότερο οι clients να επικοινωνούν απευθείας με το server.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos