Code d’abord 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. Le 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.

Conditions préalables

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

Vous aurez également besoin de la version 6.1 (ou ultérieure) de l' Entity Framework Tools pour Visual Studio installé. Consultez Obtenir Entity Framework pour plus d’informations sur l’installation de la dernière version d’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 Explorateur de serveurs avant de devoir sélectionner Microsoft SQL Server comme source de données

    Select Data Source

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

    LocalDB Connection

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

    Create Database Dialog

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

  • Copiez le code SQL suivant dans la nouvelle requête, 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éation de 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électionnez Windows dans le menu de gauche et application console
  • Entrez CodeFirstExistingDatabaseSample comme nom
  • Sélectionnez OK.

 

3. Modèle d’ingénieur inverse

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 Entity Data Model

  • Entrez BloggingContext comme nom, puis cliquez sur OK

  • Cette opération lance l’Assistant Entity Data Model

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

    Wizard One CFE

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

    Wizard Two CFE

  • Cliquez sur la case à cocher en regard de Tables pour importer toutes les tables, puis cliquez sur Terminer

    Wizard Three 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 BloggingContext 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 DbSet<TEntity> 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 au 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, un blog et classe billet ont également été ajoutés 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’alignaient pas sur la structure de la base de données existante. Par exemple, vous verrez l’annotation StringLength sur Blog.Name et Blog.Url car elles ont 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 et écriture de données

Maintenant que nous avons un modèle, il est temps de l’utiliser pour accéder à certaines données. Implémentez la méthode Principale dans Program.cs , comme indiqué ci-dessous. Ce code crée une instance de notre contexte, puis l’utilise pour insérer une nouvelle 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 de point de départ 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 des migrations Code First vers une base de données existante

Si vous souhaitez utiliser des migrations Code First avec une base de données existante, consultez Migrations Code First vers 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 peuvent être utilisées pour stocker et récupérer des données.