web-dev-qa-db-fra.com

Entity Framework Core créant un modèle à partir d'une base de données existante

Avec Entity Framework Core, comment générez-vous le modèle EF et les entités?

Selon ASP.NET Core - Base de données existante Article Microsoft, vous devez exécuter une commande semblable à celle-ci dans la console du gestionnaire de package: 

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

Cela ne vous donne aucun contrôle sur les tables ou les vues à importer. Est-il possible que ce soit le seul moyen de procéder à l'ingénierie inverse de la base de données et de créer les modèles et les entités EF maintenant avec EF Core et comment progresse-t-il par rapport à la manière dont cela a été fait avec Entity Framework complet depuis des années?

15
Dean Kuga

Il n’existe aucun moyen de le faire dans Entity Framework Core . Lisez la documentation ici: https://docs.Microsoft.com/en-us/ef/efcore-and-ef6/features

6
Shloimy

Je sais que cette question est un peu ancienne, mais je pense qu'elle est très utile pour les personnes qui tombent sur le même problème.

Si j'ai bien compris votre question, vous souhaitez spécifier les tables à générer . Cela devrait être possible si vous ajoutez le paramètre -Tables à la commande. 

Voici la commande que j'ai utilisée pour générer 3 tables de la base de données (dans la console Package-Manager):

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=DatabaseName;Trusted_Connection=True;"  
     -Provider Microsoft.EntityFrameworkCore.SqlServer 
     -OutputDir Models -Context NorthwndContext 
     -Tables Products,Categories,Suppliers -Force

Comme vous pouvez le constater, j'utilise la base de données Northwnd et ne génère que les tableaux "Produits, catégories et fournisseurs". Évidemment, vous pouvez ajouter plus de tableaux, il vous suffit de les séparer par des virgules.

Si vous ne le savez pas, vous pouvez obtenir le nom de la base de données en allant dans Connexions de données (Explorateur de serveurs), cliquez sur la base de données que vous souhaitez ajouter et sur le côté droit (Propriétés), vous verrez une propriété (nom). Pour moi, c'était "NORTHWND.MDF".

J'ai utilisé -Force pour remplacer les modèles que j'ai déjà créés.

Vous pouvez utiliser -DataAnnotations pour obtenir des modèles annotés. Sinon, vous obtenez une configuration de modèle Fluent.

PS: Je n'ai essayé cela qu'avec ASP.NET Core 2 et Entity Framework Core 2.0.0.

37
HiHo

Ma situation était que j'avais une bibliothèque de classe .net 4.5+ avec DbContexts dedans.

Ces DbContexts avaient été créés à partir d'une base de données existante à l'aide de l'assistant "Code d'abord de la base de données existante". Ce Wizard semble manquer à EF Core.

Pour créer un nouveau code d'abord DbContext à partir d'une base de données existante compatible avec EF Core, j'ai suivi vaguement le guide ici

Mes pas:

  • Création d'une nouvelle bibliothèque de classes de base

  • Ajout du package de nuget Microsoft.EntityFrameworkCore

  • Ajout du package de nuget Microsoft.EntityFrameworkCore.Tools
  • Ajout du package de nuget Microsoft.EntityFrameworkCore.SqlServer
  • Ajout du package de nuget Microsoft.EntityFrameworkCore.SqlServer.Design

  • Ouverture de la console du gestionnaire de packages de nuget

  • Entré le commande

    Scaffold-DbContext "data source=MYSQLDBSERVER\MYSQLINSTANCE;initial catalog=MYDB;integrated security=True;MultipleActiveResultSets=True;"
    
  • Entré en tant que fournisseur

    Microsoft.EntityFrameworkCore.SqlServer
    

Veuillez noter que lorsque vous utilisez un projet non principal, vous pouvez rencontrer des problèmes avec la console du gestionnaire de packages de nuget. J'ai évité ce problème en créant simplement une nouvelle bibliothèque de classes principale au lieu d'une bibliothèque .net.

Une fois que vous avez créé le contexte, vous pouvez le modifier comme d'habitude dans Code First, par exemple. vous pouvez supprimer les tables que vous ne voulez pas utiliser.

5
Yamamoto Hagi

Vous pouvez également appliquer la méthode du tricheur: Ouvrez VS2015, créez une nouvelle classe lib avec le même nom que le projet réel, puis exécutez l'Assistant Modèle de données d'entité.

Une fois que vous avez terminé, copiez et collez dans votre projet principal .net. Il faut un peu de peaufinage du code résultant, mais c'est trivial.

Cependant, exécuter la commande scaffold comme ci-dessus est une meilleure solution.

2
Greg Gum

Ceux qui veulent convertir le schéma de base de données SQL en noyau EF à l’aide de dotnet core suivent les étapes suivantes:

Exécutez toutes les commandes l'une après l'autre (première commande pour ceux qui veulent créer un nouveau projet, sinon vous pouvez l'ignorer et simplement exécuter d'autres commandes depuis le dossier racine de votre projet).

dotnet new mvc -o <ProjectName>

dotnet add package Microsoft.EntityFrameworkCore.SqlServer

dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design

dotnet add package Microsoft.EntityFrameworkCore.SqlServer.Design

dotnet add package Microsoft.EntityFrameworkCore.Tools

dotnet tool install --global dotnet-aspnet-codegenerator

Finalement...

dotnet ef dbcontext scaffold "Server=servername\instancename;Database=My_Database;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models

Cela créera les modèles nécessaires et le contexte de votre schéma de base de données dans le dossier models de votre projet. 

Maintenant, vous pouvez facilement générerCRUDcode en appliquant la commande suivante:

dotnet aspnet-codegenerator controller -name <MyNewController> -m <ModelName> -dc <MyDbContext> --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries 

Modifiez le MyNewController avec le nom du contrôleur souhaité, ModelName avec le nom du modèle dans le dossier modèles que vous souhaitez cibler et enfin MyDbContext avec le nom du fichier de contexte généré par le système disponible dans le dossier Modèles

mais avant d’exécuter cette commande, assurez-vous d’avoir apporté les modifications nécessaires dans votre fichier appsettings.json et startup.cs dans le dossier de votre projet.

appsettings.json ajouter après la ligne

"AllowedHosts": "*",

 "ConnectionStrings": {
    "MyDbConnection": "Server=servername\\instancename;Database=My_Database;Trusted_Connection=True;"
  }

startup.cs fichier ajouter juste avant la ligne

services.AddMvc (). SetCompatibilityVersion (CompatibilityVersion.Version_2_2);

services.AddDbContext<SwiftRbs_LocalContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("MyDbConnection")));

Prendre plaisir!!

0
Manoj Roy