publicclassMyAppContext : DbContext
{
// permet de passer des options à la construction du DbCDbContextontextpublicMyAppContext(DbContextOptions<MyAppContext> options) : base(options)
{}
publicDbSet<Item> Items { get; set; }
// pour ASP.NET Core, préférer la configuration dans Startup.ConfigureServicesprotectedoverridevoidOnConfiguring(DbContextOptionsBuilderoptionsBuilder)
{
optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings["SqlServerConnectionString"].ConnectionString);
}
}
// définit le nom de la table, par défaut le nom de la classe est utilisées
[Table("Items")]
publicclassItem
{
publicint Id { get; set; }
[Column("My_Name")] // mappingpublicstring Name { get; set; }
// définit le type SQL qui sera utilisé pour le stockage de la donnée, ici un décimal de 7 chiffres dont 2 après la virgule
[Column(TypeName = "decimal(7, 2)")]
publicdecimal Price { get; set; }
[Column(TypeName = "date")]
publicDateTime Date { get; set; }
}
Nécessite le package nuget System.ComponentModel.DataAnnotations
# tester si Entity Framework Core Tools est bien installé et fonctionnel
dotnet ef
# bien se mettre dans le dossier du projet# faire un dotnet restore au cas où la restoration n'aurait pas fonctionnée
EF Core 3.x
# dotnet ef must be installed as a global or local tool
dotnet tool install --global dotnet-ef
# installed in ~/.dotnet/tools# Add ~/.dotnet/tools to PATH# ajouter le paquet nuget suivant
dotnet add package Microsoft.EntityFrameworkCore.Design
Si le fichier de projet ne contient pas Microsoft.EntityFrameworkCore.Tools.DotNet, l'ajouter. (version)
À la sauvegarde NuGet va restaurer les paquets nécessaires.
# création du fichier de migration
dotnet ef migrations add InitialCreate
# un fichier YYYYMMDDHHMMSSS_IntialCreate.cs est créé dans le dossier Migration# supprimer la dernière migration
dotnet ef migrations remove
# il faut créer une migration avant de pouvoir passer à la génération# génération d'un script SQL pour voir ce que va faire la migration
dotnet ef migrations script <FROM> <TO>
# From: 0 par défaut# To: dernière migration par défaut# génération et exécution du script SQL
dotnet ef database update
Configuration
Startup.cs
using Microsoft.EntityFrameworkCore;
publicvoidConfigureServices(IServiceCollectionservices)
{
// SQL Server
services.AddDbContext<AppContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("SqlServerConnectionString2"))
);
// In Memory
services.AddDbContext<AppContext>(options =>
options.UseInMemoryDatabase("WebApplicationCoreMemoryDb");
);
// MySql
services.AddDbContext<AppDbContext>(options =>
options.UseMySql(Configuration.GetConnectionString("MySqlConnectionString"),
mySqlOptions => mySqlOptions.ServerVersion(
newServerVersion(newVersion(10, 4, 11),
ServerType.MariaDb)))
);
EF fait ses requêtes en lazy loading, ce qui veut dire que les requêtes SQL ne sont exécutées que lorsqu'on a besoin des données.
// 1 requête pour récupérer tous les contactsIEnumerable<Contact> allContacts = context.Contacts;
foreach (var contact in allContacts)
{
// pour récupérer l'age de chaque contact il faut faire une nouvelle requête pour chaque contact// ce qui donne de mauvaises performancesif (contact.age > 30) { /* ... */ }
}
// inclure Age lors de la récupération des contacts// ainsi tous se fait en une seule requêteIEnumerable<Contact> allContacts = context.Contacts.Include(c => c.Age);
Erreur sur Linux durant l'exécution de dotnet ef database update. Impossible de se connecter au serveur SQL.
Passer Trusted_Connection à False et ajouter le user et password à la connection string corrige le problème.
<ProjectSdk="Microsoft.NET.Sdk"><!-- Ajouter le groupe suivant --><ItemGroup><DotNetCliToolReferenceInclude="Microsoft.EntityFrameworkCore.Tools"Version="2.0.0" /><DotNetCliToolReferenceInclude="Microsoft.EntityFrameworkCore.Tools.DotNet"Version="2.0.0" /></ItemGroup>