publicclassMyAppContext : DbContext
{
// permet de passer des options à la construction du DbContextpublicMyAppContext(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.
Permet de remplir la bdd avec un jeu initial de données.
Data/MyAppContext.cs
protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder)
{
modelBuilder.Entity<Item>().HasData(
newItem() { Name = "Item1" },
newItem() { Name = "Item2" });
}
OLD
Data/MyAppSeeder.cs
publicclassMyAppSeeder
{
privatereadonlyMyAppContext_context;
publicMyAppSeeder(MyAppContextcontext)
{
_context = context;
}
publicvoidSeed()
{
_context.Database.EnsureCreated();
if (!_context.Items.Any())
{
_context.Items.Add(newItem() { Name = "Item 1" }); // ne pas définir l'Id_context.Items.Add(newItem() { Name = "Item 2" });
_context.SaveChanges();
}
Sartup.cs
publicvoidConfigureServices(IServiceCollectionservices)
{
services.AddTransient<MyAppSeeder>();
}
publicvoidConfigure(IApplicationBuilderapp, IHostingEnvironmentenv)
{
using (varscope = app.ApplicationServices.CreateScope())
{
var seeder = scope.ServiceProvider.GetService<MyAppSeeder>();
seeder.Seed();
}
}
CLI
# 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
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>