Heim  >  Artikel  >  Backend-Entwicklung  >  Neue Funktionen von EF Core 2.0

Neue Funktionen von EF Core 2.0

大家讲道理
大家讲道理Original
2017-05-31 14:39:042118Durchsuche




Vorwort

Die neueste Version von EF Core ist derzeit 2.0.0-priview1-final, daher geht es in diesem Artikel hauptsächlich um einige Anweisungen für diese Version.

Hinweis: Wenn Sie .NET Core 2.0 mit Visual Studio verwenden möchten, benötigen Sie mindestens die Vorschauversion von Visual Studio 2017 15.3.

Empfohlene verwandte MySQL-Video-Tutorials: „MySQL-Tutorial

Installieren oder aktualisieren Sie auf EF Core 2.0

Sie können den folgenden Befehl verwenden um Ihre aktuelle Version von .NET Core zu installieren oder zu aktualisieren.

// 安装
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

Toolkit

// 直接修改 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

Neue Funktionen von EF Core 2.0

Verbesserte LINQ-Übersetzung

  • Vermeiden Sie die Erstellung unnötig notwendiger Unterabfragen

  • Einige Befehle wechseln zur Ausführung zum Client

  • Nur ​​wenige Anfragen rufen alle Spalten der Tabelle ab

  • Etwas verwandelt eine einzelne LINQ-Abfrage in eine N+1-Abfrage ohne ordnungsgemäße Filterung.

EF.Functions.Like()

EF.Functions-Eigenschaften in EF Core 2.0 hinzugefügt, EF Core Provider kann sie verwenden, um einige den Datenbankmethoden zugeordnete Funktionen anzupassen der letztgenannten Operatoren, damit sie in LINQ-Abfragen aufgerufen werden können. Zum Beispiel:

var aCustomers =
    from c in context.Customers
    where EF.Functions.Like(c.Name, "a%");
    select c;

Entitäten und Tabellen trennen

Was bedeutet es, Entitäten und Tabellen zu trennen? In der Vergangenheit wurde eine Datenbanktabelle einem Entitätsobjekt in EF zugeordnet, d. h. es bestand eine Eins-zu-eins-Entsprechung zwischen der Tabelle und der Entität. In Version 2.0 ist es dann zulässig, einige verwandte Entitäten einer Tabelle zuzuordnen, und EF verwaltet diese Instanzen oder Referenzbeziehungen.

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

Beim Generieren von Datenbanktabellen werden Customer und Address in einer Tabelle generiert.

Hinweis: Diese Funktion in Privilege1 ist noch nicht vollständig.

Globale Abfragefilterung

Die neue Version führt eine Funktion namens „vertikale Filterung“ ein, die eine relativ häufige Anforderung ist.

Wenn wir das EF Core-Kontextmodell definieren, können wir beim Erstellen des Modells einige Filterbedingungen hinzufügen, z. B. das immer Herausfiltern einiger „logisch gelöschter“ Daten bei Abfragen.

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

Dieser Filter wird automatisch angewendet, wenn Typdaten über direkte Abfrage oder Navigationseigenschaften abgefragt werden (Include()). Natürlich können Sie mit IgnoreQueryFilters() diesen globalen Filter in der Abfrage deaktivieren.

DbContext-Verbindungspool

Normalerweise erfordert die Verwendung von EF Core in ASP.NET Core einen angepassten DbContext, der dann in den Systemcontainer eingefügt und dann über den Konstruktor des aus dem Container abgerufen wird Controller. Holen Sie sich die Objektinstanz. Das bedeutet, dass bei jeder Anfrage eine neue Instanz erstellt wird.

In EF Core 2.0 wird eine neue Methode zum Einfügen eines benutzerdefinierten DbContext eingeführt, die explizit einen Instanzpool verwendet, um ihn in den Container einzufügen.

services.AddDbContextPool<BloggingContext>(
    options => options.UseSqlServer(connectionString));
Wenn der Controller mit dieser Methode eine DbContext-Instanz anfordert, prüft er zunächst, ob eine Instanz im Pool verfügbar ist. Sobald die Anfrage verarbeitet ist, wird jeder mit der Instanz verbundene Status zurückgesetzt und die Instanz wird an den Pool zurückgegeben.

Dieses Konzept ähnelt in gewisser Weise dem Datenbankverbindungspool in ADO.NET, was den Vorteil hat, dass die Kosten für die Initialisierung einer DbContext-Instanz eingespart werden. Viele ASP.NET Core-Anwendungen können diesen Ansatz nutzen, um Leistungsverbesserungen zu erzielen.

Abfragen manuell kompilieren

Frühere Versionen von EF und Linq to SQL stellten eine API zum manuellen oder expliziten Kompilieren von Abfragen bereit, die es Anwendungen ermöglichte, übersetzte Abfragen zwischenzuspeichern, sodass sie einmal kompiliert und mehrmals ausgeführt werden können mal.

Obwohl EF Core Abfragen basierend auf Abfrageausdrücken automatisch kompilieren und zwischenspeichern kann, kann dieser Mechanismus eine kleine Verbesserung der Abfrageleistung erzielen, indem Hash-Berechnungen oder Caching umgangen werden, sodass Anwendungen bereits aufgerufene Abfragen verwenden können Kettenzusammenstellung.

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

EF Core 2.0 wird auch einige wesentliche Anpassungen an einigen Protokollierungs- und Diagnoseinfrastrukturen sowie die Integration mit Azure Application Insights vornehmen.

Das Hinzufügen von Lazy Loading wird noch diskutiert und könnte zu EF Core 2.1 hinzugefügt werden.




Das obige ist der detaillierte Inhalt vonNeue Funktionen von EF Core 2.0. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn