J'ai récemment entrepris un nouveau projet en utilisant ASP.NET MVC et je ne suis pas très familier avec la technologie. Je suis encore au tout début et je suis sur le point de commencer à m'apprendre à utiliser Entity Framework pour gérer mon code d'accès aux données. J'ai juste du mal à me faire une idée de ce que les logiciels / outils / fonctionnalités peuvent faire quoi, mais je pense que je suis sur la bonne voie avec EF.

Je recherche quelque chose qui va pouvoir voir les différences dans ma base de données locale par rapport à celle de ma base de données de production (schéma, pas les données réelles) et pouvoir le publier sur un serveur SQL de notre réseau local . Dans mon esprit, je pense à cela comme un DVCS pour les bases de données.

Traditionnellement (comme la plupart je dirais) j'écrivais mon propre code d'accès aux données en utilisant SQL dans mon code ou des procédures stockées, etc. et je m'occupais moi-même du côté base de données. Ce n'est plus une option pour moi car je dois mettre en place des environnements séparés pour le développement et la production, et je n'ai plus vraiment le temps ni le désir d'écrire manuellement tout ce code. Le développement sera local sur la machine de développement et la production sera hébergée sur un serveur de notre réseau local.

J'ai récemment commencé à utiliser la fonctionnalité "Publier" dans Visual Studio et j'ai réussi à configurer cela pour fonctionner plutôt bien, en publiant de nouvelles versions dans le répertoire que mon serveur IIS recherche pour servir le site.

J'utilise Git et Sourcetree pour gérer DVCS pour le code de mon projet, mais je n'ai jamais personnellement utilisé ou trouvé de solution pour faire quelque chose de similaire pour la base de données. Au début, je pensais que je cherchais une sorte de DVCS pour SQL Server, mais cela n'a pas beaucoup rapporté. Essentiellement, je veux juste une sorte d'outil qui va gérer les différences de version entre les bases de données locales et de production, et je pense que c'est quelque chose qu'EF peut faire pour moi.

Pour la base de données, j'utilise SQL Server. Je n'ai pas encore mis en place de base de données pour ce projet, donc je pense que l'EF code-first serait la meilleure approche. Je veux cependant m'assurer qu'EF utilise une base de données dans SQL Server, que je crois pouvoir définir en spécifiant une chaîne de connexion à utiliser par opposition à une dans Visual Studio. J'ai parfois besoin d'un accès à la base de données via SSMS pour pouvoir jouer avec des index et des plans de sauvegarde, ce que je ferais normalement via SSMS, mais j'aimerais toujours qu'EF fasse la majeure partie du travail pour moi.

  1. Puis-je atteindre les objectifs souhaités en utilisant Entity Framework comme je l'espère? Autrement dit, avoir un outil qui traite des différences de base de données et des mises à jour entre les versions? Je ne veux pas avoir à déterminer quelles tables / colonnes, etc. J'ai changé localement et je dois en quelque sorte travailler cela dans la base de données de production, mais je ne veux pas non plus que les données de la base de données de production changent, juste le structure...
  2. J'aimerais que quiconque donne des conseils sur la façon dont cette configuration devrait être construite, ou même des liens vers un tutoriel sur la façon de la configurer. Je suis sûr que je ne suis pas la première personne à vouloir faire ça, et je sais que je ne serai pas la dernière.

Essentiellement, je voudrais simplement cliquer sur le bouton "Publier" et faire publier toutes les différences locales dans le code ET la base de données sur le serveur de production.

5
Sean Missingham 5 janv. 2016 à 08:58

2 réponses

Meilleure réponse

Puis-je atteindre les objectifs souhaités en utilisant Entity Framework comme je l'espère?

Cela peut être facilement fait par EntityFramework. Ce que vous recherchez s'appelle "EF Migrations". Les migrations EF scanne vos classes POCO pour voir si elles correspondent à votre base de données. S'il y a quelque chose de nouveau ou de modifié, il mettra à jour les tables de base de données pour vous. Pour savoir comment utiliser les migrations EF, consultez ce lien https://msdn.microsoft. com / fr-us / data / jj591621.aspx

La chaîne de connexion peut être résolue par les transformations Web.Config / App.Config. La transformation Web.Config remplace automatiquement la chaîne de connexion de développement par la chaîne de connexion de production lors de la publication. Pour découvrir comment utiliser la transformation web.config, consultez ce lien http://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/web-config-transformations

Lors de la publication, vous pouvez demander à VisualStudio de vérifier les migrations qui n'ont toujours pas été appliquées à la base de données de production et d'appliquer ces migrations automatiquement. Cet article http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/migrations -and-deployment-with-the-entity-framework-in-an-asp-net-mvc-application montre comment appliquer des migrations lors de la publication sur Windows Azure.

J'espère que cela aide!

4
Fabio Luz 5 janv. 2016 à 06:36

Dans le cadre d'entité, si vous travaillez avec une base de données existante , vous pouvez définir la chaîne de connexion au moment de l'exécution.

Le constructeur DbContext vous permet d'inclure une chaîne de connexion soit par nom (dans le fichier app.config ou web.config selon l'application) soit par la chaîne de connexion SQL complète, mais avec la section de métadonnées supplémentaire.

Par exemple, si vous aviez un DbContext défini comme:

public YourModelContainer() : base("name=YourModelContainer")
{
}

Notez que l'appel à base ("name = ...") vous permet de spécifier une chaîne de connexion de structure d'entité nommée dans votre fichier de configuration.

Pour en créer un au moment de l'exécution, vous créeriez un constructeur surchargé avec:

public YourModelContainer(string connectionString) : base(connectionString)
{
  // where connection string includes the metadata section
  // metadata=res://*/Models.YourModel.csdl|res://*/Models.YourModel.ssdl|res://*/Models.YourModel.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=YourDatabase;user id=dev;password=p455w0rd;MultipleActiveResultSets=True;App=EntityFramework"
  // This is just a concatenation of the metadata with a SQL connection string, you can use the EntityConnectionStringBuilder class if you're building this manually at runtime
}

Voir https://stackoverflow.com/a/26043339/474702

2
Community 23 mai 2017 à 12:00