Est-il correct de mettre à jour une firebase database de production avec les migrations EF?

Selon ce billet de blog, la plupart des entresockets utilisant EF Migrations ne sont pas censées mettre à jour le schéma de firebase database des bases de données de production avec les migrations EF. Au lieu de cela, l’auteur de l’article de blog recommande d’utiliser les scripts de mise à jour de schéma dans le cadre du processus de déploiement.

J’ai utilisé les scripts de mise à jour de schéma depuis quelques années maintenant et pendant qu’ils fonctionnaient, je prévoyais d’utiliser les migrations EF à l’avenir pour les raisons suivantes:

  • Déploiement plus rapide, moins de temps d’arrêt
  • Une procédure de déploiement plus simple
  • Migration beaucoup plus facile des données existantes qu’avec T-SQL
  • Une syntaxe plus compréhensible des modifications en attente d’application (classe DbMigration avec une syntaxe C # claire vs un script de migration T-SQL maladroit dans un environnement traditionnel).
  • Il existe un chemin de rétrogradation facile et rapide vers l’ancien schéma de firebase database si le déploiement de la nouvelle version du logiciel échoue

Une des raisons pour lesquelles je pourrais penser que cela empêcherait l’utilisation d’EF pour migrer une firebase database de production serait que le schéma de firebase database ne soit modifié que par les administrateurs de bases de données et non par les développeurs. Cependant, je suis à la fois DBA et Developer, cela n’a pas d’importance dans mon cas.

Alors, quels sont les risques de mettre à jour une firebase database de production en utilisant EF?

Edit: Je voudrais append que, comme solomon8718 l’a déjà suggéré, je tire toujours une nouvelle copie de la firebase database de production sur mon serveur de transfert et teste les EF Migrations à appliquer au serveur de transfert avant de les appliquer à un serveur de production. IMO est essentiel pour toute mise à jour de schéma d’un système de production, que j’utilise ou non les migrations EF.

Eh bien, je vais essayer de répondre de toute façon. Je dirais que non, il n’y a aucune raison de ne pas utiliser Code First Migrations en production. Après tout, quel est le but de ce système facile à utiliser si vous ne pouvez pas le prendre complètement?

Les plus gros problèmes que je vois avec tous les problèmes que vous pouvez avoir avec n’importe quel système, que vous avez déjà noté. Tant que toute l’équipe (DBA incluse, le cas échéant) est associée, je pense que permettre à EF de gérer le schéma par le biais de migrations est moins complexe et donc moins sujet aux erreurs que la gestion traditionnelle basée sur un script. Je ferais quand même une sauvegarde avant d’effectuer une migration sur un système de production, mais vous le feriez quand même.

Rien n’indique qu’un administrateur de firebase database ne peut pas non plus effectuer de migration à partir de Visual Studio. L’access pourrait toujours être verrouillé avec des privilèges au niveau de la firebase database, et il / elle pourrait examiner la migration (dans un format d’exportation SQL utile en utilisant -Script , si désiré) avant d’effectuer l’opération proprement -Script . Ensuite, ils sont toujours sous contrôle, mais vous pouvez utiliser des migrations basées sur le code. Enfer, ils pourraient même finir par aimer ça!

Mise à jour: depuis que les SPROC et les TVF ont été mis en place, nous les traitons également dans les migrations, bien qu’ils soient réellement exécutés avec des instructions SQL simples utilisant un appel DbMigration.Sql() dans le Up() , et inversement. Down() (Vous pouvez également utiliser CreateStoredProcedure et DropStoredProcedure pour des SPROC simples, mais je pense que vous devez toujours définir le corps lui-même en SQL). Je suppose que vous pourriez dire que c’est une mise en garde; Il n’y a pas encore de moyen pour une firebase database complète et complète d’être écrite uniquement en C #. Toutefois, vous pouvez utiliser des migrations comprenant des scripts SQL pour gérer l’intégralité du schéma. L’un des avantages de ce processus est que vous pouvez utiliser le fichier de configuration C # pour les noms d’object de schéma (différents noms de serveur pour la production vs dev par exemple) avec un Ssortingng.Format simple, combiné à XML Transformation pour les fichiers de configuration eux-mêmes.

Oui, il existe de bonnes raisons de ne pas utiliser un système automatisé tel que Code First Migrations pour modifier les bases de données de production . Mais comme toujours, il y a des exceptions aux règles.

  1. L’une des raisons évoquées serait les permissions d’access, qui seraient directement liées aux règles de gestion des modifications et aux règles de sécurité de votre organisation.

  2. Une autre raison serait votre niveau de confiance dans l’outil Migrations lui-même. Sommes-nous sûrs que l’outil ne contient pas de bogue? Que se passe-t-il si l’outil échoue à mi-parcours? Êtes-vous certain d’avoir des sauvegardes à jour et un processus de restauration si nécessaire?

  3. Les scripts de modification peuvent exécuter des scripts inattendus ou inefficaces. J’ai rencontré des cas où le SQL généré copiait les données dans une table temporaire, supprimait la table d’origine, puis recréait la table d’origine pour des choses comme l’ajout d’une nouvelle colonne si vous changiez accidentellement (ou intentionnellement) l’ordre dans lequel la colonne apparaît, ou quand vous renommez la table. Si des millions d’enregistrements sont impliqués, cela pourrait entraîner de sérieux problèmes de performance.

Ma recommandation:

En supposant que vous ayez une firebase database intermédiaire qui reflète votre schéma de production, utilisez l’outil Migrations pour générer ses scripts de modification sur ce système. Nous restaurons généralement notre firebase database de scènes à partir d’une nouvelle copie de production avant de l’exécuter. Nous examinons ensuite les scripts de modification manuellement pour rechercher les problèmes. Après cela, nous exécutons les scripts sur notre firebase database de scène pour nous assurer qu’elle s’exécute correctement et que toutes les modifications attendues ont eu lieu. Maintenant, nous sums certains que les scripts peuvent être exécutés en toute sécurité et effectuer les modifications attendues. Ce processus permettrait de résoudre les trois problèmes énumérés ci-dessus.

Une autre mise en garde: si vous avez plusieurs sites Web utilisant le même contexte de données, vous devez vous assurer qu’ils sont tous mis à jour en même temps. Sinon, il pourrait y avoir une mise à jour / mise à niveau constante de la firebase database entre les sites Web. A part ça, ça a bien marché pour moi.

EDIT: Ma propre perspective un an après avoir commencé à utiliser EF Migrations en production:

EF Migrations est en fait plutôt cool, même pour une utilisation en production, à condition que vous

  1. Testez les migrations sur un système de transfert. Je teste toutes les migrations en effectuant une migration complète sur mon serveur CI avant de lancer les tests d’intégration.
  2. Ne déclenchez pas automatiquement les migrations, mais avec un fichier de commandes lancé par un administrateur. Cela revient essentiellement à exécuter manuellement SQL pour une migration dans SSMS.

Je l’utilise en production pour quelques projets. Une fois que vous avez compris, je pense que ça va.

Pendant le développement, vous pouvez conserver les migrations automatiques, mais à la fin, vous pouvez vous connecter à la firebase database live directement depuis la console du gestionnaire de packages et générer une migration. Il vous donnera une migration pour tous les changements.

Mais toujours toujours utiliser l’option -script avec update-database et -script le SQL vous-même.

Je vous conseille également de ne pas utiliser l’option update db de Web deploy. De cette façon, il est impossible de savoir quelle partie de la migration a déjà été déclenchée par erreur. J’ai eu quelques problèmes avec ça quelques fois. Donc, mieux vaut obtenir le SQL et le lancer manuellement.