Nowe funkcje w programie EF Core 2.1

Oprócz licznych poprawek usterek i drobnych ulepszeń funkcjonalności i wydajności program EF Core 2.1 zawiera kilka atrakcyjnych nowych funkcji:

Ładowanie opóźnione

Program EF Core zawiera teraz niezbędne bloki konstrukcyjne dla każdego, kto może tworzyć klasy jednostek, które mogą ładować ich właściwości nawigacji na żądanie. Utworzyliśmy również nowy pakiet Microsoft.EntityFrameworkCore.Proxies, który wykorzystuje te bloki konstrukcyjne do tworzenia leniwych klas serwerów proxy ładowania na podstawie klas jednostek zmodyfikowanych minimalnie (na przykład klas z właściwościami nawigacji wirtualnej).

Przeczytaj sekcję dotyczącą ładowania leniwego, aby uzyskać więcej informacji na temat tego tematu.

Parametry w konstruktorach jednostek

Jako jeden z wymaganych bloków konstrukcyjnych na potrzeby ładowania z opóźnieniem włączyliśmy tworzenie jednostek, które przyjmują parametry w swoich konstruktorach. Możesz użyć parametrów, aby wstrzyknąć wartości właściwości, leniwe delegaty ładowania i usługi.

Przeczytaj sekcję dotyczącą konstruktora jednostki z parametrami , aby uzyskać więcej informacji na temat tego tematu.

Konwersje wartości

Do tej pory platforma EF Core mogła mapować tylko właściwości typów natywnie obsługiwanych przez bazowego dostawcę bazy danych. Wartości zostały skopiowane z powrotem i z powrotem między kolumnami i właściwościami bez żadnego przekształcenia. Począwszy od programu EF Core 2.1, konwersje wartości można zastosować w celu przekształcenia wartości uzyskanych z kolumn, zanim zostaną zastosowane do właściwości i na odwrót. Mamy szereg konwersji, które można zastosować zgodnie z konwencją w razie potrzeby, a także jawny interfejs API konfiguracji, który umożliwia rejestrowanie konwersji niestandardowych między kolumnami i właściwościami. Oto niektóre zastosowania tej funkcji:

  • Przechowywanie wyliczenia jako ciągów
  • Mapowanie niepodpisanych liczb całkowitych za pomocą programu SQL Server
  • Automatyczne szyfrowanie i odszyfrowywanie wartości właściwości

Przeczytaj sekcję dotyczącą konwersji wartości, aby uzyskać więcej informacji na temat tego tematu.

Tłumaczenie LINQ GroupBy

Przed wersją 2.1 w programie EF Core operator GroupBy LINQ zawsze będzie oceniany w pamięci. Obecnie obsługujemy tłumaczenie jej na klauzulę SQL GROUP BY w najbardziej typowych przypadkach.

W tym przykładzie przedstawiono zapytanie z elementem GroupBy używanym do obliczania różnych funkcji agregujących:

var query = context.Orders
    .GroupBy(o => new { o.CustomerId, o.EmployeeId })
    .Select(g => new
        {
          g.Key.CustomerId,
          g.Key.EmployeeId,
          Sum = g.Sum(o => o.Amount),
          Min = g.Min(o => o.Amount),
          Max = g.Max(o => o.Amount),
          Avg = g.Average(o => o.Amount)
        });

Odpowiednie tłumaczenie SQL wygląda następująco:

SELECT [o].[CustomerId], [o].[EmployeeId],
    SUM([o].[Amount]), MIN([o].[Amount]), MAX([o].[Amount]), AVG([o].[Amount])
FROM [Orders] AS [o]
GROUP BY [o].[CustomerId], [o].[EmployeeId];

Wstępne wypełnianie danych

Wraz z nową wersją będzie możliwe podanie początkowych danych w celu wypełnienia bazy danych. W przeciwieństwie do programu EF6 dane rozmieszczania są skojarzone z typem jednostki w ramach konfiguracji modelu. Następnie migracje platformy EF Core mogą automatycznie obliczać, jakie operacje wstawiania, aktualizowania lub usuwania muszą być stosowane podczas uaktualniania bazy danych do nowej wersji modelu.

Na przykład możesz użyć tego polecenia, aby skonfigurować dane inicjucyjne dla obiektu Post w programie OnModelCreating:

modelBuilder.Entity<Post>().HasData(new Post{ Id = 1, Text = "Hello World!" });

Przeczytaj sekcję dotyczącą rozmieszczania danych, aby uzyskać więcej informacji na temat tego tematu.

Typy zapytań

Model EF Core może teraz zawierać typy zapytań. W przeciwieństwie do typów jednostek typy zapytań nie mają zdefiniowanych kluczy i nie można ich wstawiać, usuwać ani aktualizować (czyli tylko do odczytu), ale mogą być zwracane bezpośrednio przez zapytania. Niektóre scenariusze użycia typów zapytań to:

  • Mapowanie na widoki bez kluczy podstawowych
  • Mapowanie na tabele bez kluczy podstawowych
  • Mapowanie na zapytania zdefiniowane w modelu
  • Obsługa jako typ zwracany dla FromSql() zapytań

Przeczytaj sekcję dotyczącą typów zapytań, aby uzyskać więcej informacji na temat tego tematu.

Uwzględnij dla typów pochodnych

Teraz będzie można określić właściwości nawigacji zdefiniowane tylko na typach pochodnych podczas pisania wyrażeń dla Include metody. W przypadku silnie typizowanej Includewersji programu obsługujemy użycie jawnego rzutowania as lub operatora. Obsługujemy również odwoływanie się do nazw właściwości nawigacji zdefiniowanych na typach pochodnych w wersji ciągu :Include

var option1 = context.People.Include(p => ((Student)p).School);
var option2 = context.People.Include(p => (p as Student).School);
var option3 = context.People.Include("School");

Przeczytaj sekcję Dołączanie do typów pochodnych , aby uzyskać więcej informacji na temat tego tematu.

Obsługa transakcji System.Transactions

Dodaliśmy możliwość pracy z funkcjami System.Transactions, takimi jak TransactionScope. Będzie to działać zarówno na platformie .NET Framework, jak i na platformie .NET Core podczas korzystania z dostawców baz danych, którzy go obsługują.

Aby uzyskać więcej informacji na temat tego tematu, przeczytaj sekcję Dotyczącą transakcji System.Transactions .

Lepsze porządkowanie kolumn w początkowej migracji

Na podstawie opinii klientów zaktualizowaliśmy migracje, aby początkowo generować kolumny dla tabel w tej samej kolejności, co właściwości są deklarowane w klasach. Należy pamiętać, że program EF Core nie może zmienić kolejności po dodaniu nowych elementów członkowskich po utworzeniu początkowej tabeli.

Optymalizacja skorelowanych podzapytania

Ulepszyliśmy tłumaczenie zapytań, aby uniknąć wykonywania zapytań SQL "N + 1" w wielu typowych scenariuszach, w których użycie właściwości nawigacji w projekcji prowadzi do łączenia danych z zapytania głównego z danymi z skorelowanego podzapytania. Optymalizacja wymaga buforowania wyników z podzapytania i wymaga zmodyfikowania zapytania w celu wyrażenia zgody na nowe zachowanie.

Na przykład następujące zapytanie zwykle jest tłumaczone na jedno zapytanie dla klientów oraz N (gdzie "N" to liczba zwróconych klientów) oddzielnych zapytań dotyczących zamówień:

var query = context.Customers.Select(
    c => c.Orders.Where(o => o.Amount  > 100).Select(o => o.Amount));

ToList() Uwzględniając w odpowiednim miejscu, należy wskazać, że buforowanie jest odpowiednie dla zamówień, które umożliwiają optymalizację:

var query = context.Customers.Select(
    c => c.Orders.Where(o => o.Amount  > 100).Select(o => o.Amount).ToList());

Należy pamiętać, że to zapytanie zostanie przetłumaczone tylko na dwa zapytania SQL: jedno dla klientów i następne dla zamówień.

Atrybut [Własnością]

Teraz można skonfigurować należące do niej typy jednostek, dodając po prostu adnotacje do typu [Owned] , a następnie upewniając się, że jednostka właściciela została dodana do modelu:

[Owned]
public class StreetAddress
{
    public string Street { get; set; }
    public string City { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public StreetAddress ShippingAddress { get; set; }
}

Narzędzie wiersza polecenia dotnet-ef zawarte w zestawie SDK platformy .NET Core

Polecenia dotnet-ef są teraz częścią zestawu .NET Core SDK, dlatego nie będzie już konieczne użycie interfejsu DotNetCliToolReference w projekcie, aby móc używać migracji lub tworzenia szkieletu elementu DbContext z istniejącej bazy danych.

Zobacz sekcję dotyczącą instalowania narzędzi, aby uzyskać więcej informacji na temat włączania narzędzi wiersza polecenia dla różnych wersji zestawu .NET Core SDK i platformy EF Core.

Pakiet Microsoft.EntityFrameworkCore.Abstractions

Nowy pakiet zawiera atrybuty i interfejsy, których można używać w projektach, aby rozświetlać funkcje platformy EF Core bez konieczności stosowania zależności od platformy EF Core jako całości. Na przykład atrybut [Owned] i interfejs ILazyLoader znajdują się tutaj.

Zdarzenia zmiany stanu

Polecenia New Tracked And StateChangedChangeTracker mogą służyć do pisania logiki reagującej na jednostki wchodzące w element DbContext lub zmieniając ich stan.

Analizator nieprzetworzonych parametrów SQL

Nowy analizator kodu jest dołączony do platformy EF Core, która wykrywa potencjalnie niebezpieczne użycie naszych nieprzetworzonych interfejsów API SQL, takich jak FromSql lub ExecuteSqlCommand. Na przykład w przypadku następującego zapytania zostanie wyświetlone ostrzeżenie, ponieważ funkcja minAge nie jest sparametryzowana:

var sql = $"SELECT * FROM People WHERE Age > {minAge}";
var query = context.People.FromSql(sql);

Zgodność dostawcy bazy danych

Zaleca się używanie programu EF Core 2.1 z dostawcami, którzy zostali zaktualizowani lub co najmniej przetestowani do pracy z programem EF Core 2.1.

Napiwek

Jeśli znajdziesz nieoczekiwaną niezgodność lub jakikolwiek problem w nowych funkcjach lub jeśli masz opinię na ich temat, zgłoś go przy użyciu naszego trackera problemów.