Code First vers une base de données existante

Cette procédure pas à pas fournit une introduction au développement Code First ciblant une base de données existante. Code First vous permet de définir votre modèle à l’aide de C# ou de classes VB.Net. Vous pouvez éventuellement effectuer une configuration supplémentaire à l’aide d’attributs sur vos classes et propriétés ou à l’aide d’une API Fluent.

Prérequis

Vous devrez installer Visual Studio 2012 ou Visual Studio 2013 pour effectuer cette procédure pas à pas.

Vous aurez également besoin de la version 6.1 (ou ultérieure) d’Entity Framework Tools pour Visual Studio installée. Pour plus d’informations sur l’installation de la dernière version d’Entity Framework Tools, consultez Obtenir Entity Framework Tools.

1. Créer une base de données existante

En règle générale, lorsque vous ciblez une base de données existante, elle sera déjà créée, mais pour cette procédure pas à pas, nous devons créer une base de données à accéder.

Allons-y et générons la base de données.

  • Ouvrez Visual Studio.

  • Affichage -> Explorateur de serveurs

  • Cliquez avec le bouton droit sur Connexions de données -> Ajouter une connexion...

  • Si vous n’avez pas connecté à une base de données à partir de l’Explorateur de serveurs avant de devoir sélectionner Microsoft SQL Server comme source de données

    Sélectionner une source de données

  • Connectez-vous à votre instance LocalDB et entrez Blogs comme nom de base de données

    Connexion LocalDB

  • Sélectionnez OK et vous serez invité à créer une base de données, sélectionnez Oui.

    Boîte de dialogue Créer une base de données

  • La nouvelle base de données s’affiche désormais dans l’Explorateur de serveurs, cliquez dessus avec le bouton droit, puis sélectionnez Nouvelle requête.

  • Copiez le code SQL suivant dans la nouvelle requête, puis cliquez avec le bouton droit sur la requête, puis sélectionnez Exécuter

CREATE TABLE [dbo].[Blogs] (
    [BlogId] INT IDENTITY (1, 1) NOT NULL,
    [Name] NVARCHAR (200) NULL,
    [Url]  NVARCHAR (200) NULL,
    CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY CLUSTERED ([BlogId] ASC)
);

CREATE TABLE [dbo].[Posts] (
    [PostId] INT IDENTITY (1, 1) NOT NULL,
    [Title] NVARCHAR (200) NULL,
    [Content] NTEXT NULL,
    [BlogId] INT NOT NULL,
    CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([PostId] ASC),
    CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([BlogId]) ON DELETE CASCADE
);

INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('The Visual Studio Blog', 'http://blogs.msdn.com/visualstudio/')

INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('.NET Framework Blog', 'http://blogs.msdn.com/dotnet/')

2. Créer l’application

Pour simplifier les choses, nous allons créer une application console de base qui utilise Code First pour effectuer l’accès aux données :

  • Ouvrez Visual Studio.
  • Fichier - Nouveau ->> Projet...
  • Sélectionner Windows dans le menu de gauche et l’application console
  • Entrez CodeFirstExistingDatabaseSample comme nom
  • Sélectionnez OK.

 

3. Modèle rétro-ingénieur

Nous allons utiliser Entity Framework Tools pour Visual Studio pour nous aider à générer du code initial à mapper à la base de données. Ces outils génèrent simplement du code que vous pouvez également taper manuellement si vous préférez.

  • Projet -> Ajouter un nouvel élément...

  • Sélectionnez Données dans le menu de gauche, puis ADO.NET Modèle de données d’entité

  • Entrez BlogsContext comme nom, puis cliquez sur OK

  • Cette opération lance l’Assistant Modèle de données d’entité

  • Sélectionnez Code First à partir de la base de données , puis cliquez sur Suivant

    Assistant 1 CFE

  • Sélectionnez la connexion à la base de données que vous avez créée dans la première section, puis cliquez sur Suivant

    Assistant Deux CFE

  • Cochez la case en regard des tables pour importer toutes les tables, puis cliquez sur Terminer

    Assistant Trois CFE

Une fois que le processus de l’ingénieur inverse a terminé un certain nombre d’éléments a été ajouté au projet, examinons ce qui a été ajouté.

Fichier de configuration

Un fichier App.config a été ajouté au projet, ce fichier contient la chaîne de connexion à la base de données existante.

<connectionStrings>
  <add  
    name="BloggingContext"  
    connectionString="data source=(localdb)\mssqllocaldb;initial catalog=Blogging;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"  
    providerName="System.Data.SqlClient" />
</connectionStrings>

Vous remarquerez également d’autres paramètres dans le fichier de configuration. Il s’agit également des paramètres EF par défaut qui indiquent à Code First où créer des bases de données. Étant donné que nous mappons à une base de données existante, ces paramètres seront ignorés dans notre application.

Contexte dérivé

Une classe BlogsContext a été ajoutée au projet. Le contexte représente une session avec la base de données, ce qui nous permet d’interroger et d’enregistrer des données. Le contexte expose un TEntity> DbSet< pour chaque type de notre modèle. Vous remarquerez également que le constructeur par défaut appelle un constructeur de base à l’aide de la syntaxe name= . Cela indique à Code First que la chaîne de connexion à utiliser pour ce contexte doit être chargée à partir du fichier de configuration.

public partial class BloggingContext : DbContext
    {
        public BloggingContext()
            : base("name=BloggingContext")
        {
        }

        public virtual DbSet<Blog> Blogs { get; set; }
        public virtual DbSet<Post> Posts { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }
    }

Vous devez toujours utiliser la syntaxe name= lorsque vous utilisez une chaîne de connexion dans le fichier config. Cela garantit que si la chaîne de connexion n’est pas présente, Entity Framework lève plutôt que de créer une base de données par convention.

Classes de modèle

Enfin, une classe blog et post a également été ajoutée au projet. Il s’agit des classes de domaine qui composent notre modèle. Vous verrez les annotations de données appliquées aux classes pour spécifier la configuration où les conventions Code First ne s’alignent pas avec la structure de la base de données existante. Par exemple, vous verrez l’annotation StringLength sur Blog.Name et Blog.Url, car elle a une longueur maximale de 200 dans la base de données (la première valeur par défaut du code consiste à utiliser la longueur maximale prise en charge par le fournisseur de base de données - nvarchar(max) dans SQL Server).

public partial class Blog
{
    public Blog()
    {
        Posts = new HashSet<Post>();
    }

    public int BlogId { get; set; }

    [StringLength(200)]
    public string Name { get; set; }

    [StringLength(200)]
    public string Url { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
}

4. Lecture des & données d’écriture

Maintenant que nous avons un modèle, il est temps de l’utiliser pour accéder à certaines données. Implémentez la méthode Main dans Program.cs , comme indiqué ci-dessous. Ce code crée une nouvelle instance de notre contexte, puis l’utilise pour insérer un nouveau blog. Ensuite, il utilise une requête LINQ pour récupérer tous les blogs de la base de données classées par ordre alphabétique par titre.

class Program
{
    static void Main(string[] args)
    {
        using (var db = new BloggingContext())
        {
            // Create and save a new Blog
            Console.Write("Enter a name for a new Blog: ");
            var name = Console.ReadLine();

            var blog = new Blog { Name = name };
            db.Blogs.Add(blog);
            db.SaveChanges();

            // Display all Blogs from the database
            var query = from b in db.Blogs
                        orderby b.Name
                        select b;

            Console.WriteLine("All blogs in the database:");
            foreach (var item in query)
            {
                Console.WriteLine(item.Name);
            }

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

Vous pouvez maintenant exécuter l’application et la tester.

Enter a name for a new Blog: ADO.NET Blog
All blogs in the database:
.NET Framework Blog
ADO.NET Blog
The Visual Studio Blog
Press any key to exit...

 

Que se passe-t-il si ma base de données change ?

L’Assistant Code First to Database est conçu pour générer un ensemble de classes que vous pouvez ensuite ajuster et modifier. Si votre schéma de base de données change, vous pouvez modifier manuellement les classes ou effectuer un autre ingénieur inverse pour remplacer les classes.

Utilisation de Migrations Code First à une base de données existante

Si vous souhaitez utiliser Migrations Code First avec une base de données existante, consultez Migrations Code First à une base de données existante.

Résumé

Dans cette procédure pas à pas, nous avons examiné le développement Code First à l’aide d’une base de données existante. Nous avons utilisé Entity Framework Tools pour Visual Studio pour inverser l’ingénierie d’un ensemble de classes mappées à la base de données et qui peuvent être utilisées pour stocker et récupérer des données.