Maison  >  Article  >  développement back-end  >  Nouvelles fonctionnalités d’EF Core 2.0

Nouvelles fonctionnalités d’EF Core 2.0

大家讲道理
大家讲道理original
2017-05-31 14:39:042119parcourir




Préface

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"

Installer ou mettre à niveau vers EF Core 2.0

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

Nouvelles fonctionnalités d'EF Core 2.0

Traduction LINQ améliorée

  • É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é.

EF.Functions.Like()

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;

Séparer les entités et les tables

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.

Filtrage global des requêtes

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.

Pool de connexions DbContext

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));
En utilisant cette méthode, lorsque le contrôleur demande une instance DbContext, il vérifiera d'abord s'il existe une instance disponible dans le pool. Une fois la demande traitée, tout statut attaché à l'instance sera Réinitialisé. et l'instance est renvoyée dans le pool.

Ce concept est quelque peu similaire au pool de connexions à la base de données dans ADO.NET, qui présente l'avantage de réduire le coût d'initialisation d'une instance DbContext. De nombreuses applications ASP.NET Core peuvent utiliser cette approche pour améliorer les performances.

Compiler manuellement les requêtes

Les versions précédentes d'EF et Linq to SQL fournissaient une API pour compiler les requêtes manuellement ou explicitement, ce qui permettait aux applications de mettre en cache les requêtes traduites afin qu'elles puissent être compilées une fois et exécutées plusieurs fois. fois.

Bien qu'EF Core puisse automatiquement compiler et mettre en cache les requêtes basées sur des expressions de requête, ce mécanisme peut obtenir une légère amélioration des performances des requêtes en contournant les calculs de hachage ou la mise en cache, permettant ainsi aux applications d'utiliser des délégués qui ont déjà été appelés. compilation en chaîne.

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);
}
Autres

EF Core 2.0 apportera également des ajustements majeurs à certaines infrastructures de journalisation et de diagnostic, ainsi que l'intégration avec Azure Application Insights.

L'ajout de Lazy Loading est toujours en discussion et pourrait être ajouté à EF Core 2.1.




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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn