La dernière version d'EF Core est actuellement 2.0.0-priview1-final
, cet article concerne donc principalement quelques instructions pour cette version.
Remarque : si vous souhaitez utiliser .NET Core 2.0 avec Visual Studio, vous avez besoin d'au moins la version préliminaire de Visual Studio 2017 15.3.
Tutoriels vidéo MySQL associés recommandés : "Tutoriel MySQL"
Vous pouvez utiliser la commande suivante pour installer ou mettre à niveau votre version actuelle de .NET Core.
// 安装 PM> install-package Microsoft.EntityFrameworkCore.SqlServer -Pre -Version 2.0.0-preview1-final // 升级 PM> update-package Microsoft.EntityFrameworkCore.SqlServer -Pre -Version 2.0.0-preview1-final
Boîte à outils
// 直接修改 CSPROJ 文件 <ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0-preview1-final" /> </ItemGroup> // 或者通过以下命令 PM> update-package Microsoft.EntityFrameworkCore.Tools -Pre -Version 2.0.0-preview1-final
Évitez de créer des sous-requêtes nécessaires inutiles
Certaines commandes basculeront vers le client pour exécution
Seules quelques requêtes récupéreront toutes les colonnes de la table
Quelque chose transforme une seule requête LINQ en une requête N+1 sans filtrage approprié.
Ajout des propriétés EF.Functions dans EF Core 2.0, EF Core Provider peut les utiliser pour personnaliser certaines fonctions mappées aux méthodes de base de données de ces derniers opérateurs afin qu'ils puissent être appelés dans les requêtes LINQ. Par exemple :
var aCustomers = from c in context.Customers where EF.Functions.Like(c.Name, "a%"); select c;
Que signifie séparer les entités et les tables ? Dans le passé, une table de base de données était mappée à un objet entité dans EF, c'est-à-dire qu'il existait une correspondance biunivoque entre la table et l'entité. Ensuite, dans la version 2.0, il est autorisé de mapper certaines entités associées à une table, et EF conservera ces instances ou relations de référence.
modelBuilder.Entity<Customer>() .OwnsOne(c => c.WorkAddress);public class Customer { public int CustomerId { get; set; } public Address WorkAddress { get; set; } }public class Address { public string Line { get; set; } public string PostalOrZipCode { get; set; } public string StateOrProvince { get; set; } public string CityOrTown { get; internal set; } }
Lors de la génération des tables de base de données, Customer
et Address
seront générés dans une seule table.
Remarque : Cette fonctionnalité de privilège1 n'est pas encore terminée.
La nouvelle version introduit une fonctionnalité appelée « filtrage vertical », qui est une exigence relativement courante.
Lorsque nous définissons le modèle de contexte EF Core, nous pouvons ajouter certaines conditions de filtrage lors de la création du modèle, comme toujours filtrer certaines données « logiquement supprimées » lors de l'interrogation.
public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } public int TenantId {get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Post>() .HasQueryFilter(p => !p.IsDeleted && p.TenantId == this.TenantId ); } }
Ce filtre sera automatiquement appliqué lors de l'interrogation de données de type via une requête directe ou des propriétés de navigation (Include()
). Bien entendu vous pouvez utiliser IgnoreQueryFilters()
pour désactiver ce filtre global dans la requête.
Habituellement, l'utilisation d'EF Core dans ASP.NET Core impliquera un DbContext personnalisé, qui est ensuite injecté dans le conteneur système, puis obtenu à partir du conteneur via le constructeur du Contrôleur. Obtenez l’instance d’objet. Cela signifie qu'une nouvelle instance sera créée à chaque requête.
Dans EF Core 2.0, une nouvelle façon d'injecter un DbContext personnalisé est introduite, qui utilise explicitement un pool d'instances pour l'injecter dans le conteneur.services.AddDbContextPool<BloggingContext>( options => options.UseSqlServer(connectionString));
private static Func<CustomerContext, int, Customer> _customerById = EF.CompileQuery((CustomerContext db, int id) => db.Customers .Include(c => c.Address) .Single(c => c.Id == id)); ...using (var db = new CustomerContext()) { var customer = _customerById(db, 147); }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!