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:
Leniwe ładowanie
Program EF Core zawiera teraz niezbędne bloki konstrukcyjne dla każdego, kto chce tworzyć klasy jednostek, które mogą ładować swoje właściwości nawigacyjne na żądanie. Utworzyliśmy również nowy pakiet Microsoft.EntityFrameworkCore.Proxies, który wykorzystuje te bloki konstrukcyjne do tworzenia klas proxy do leniwego ładowania na podstawie minimalnie zmodyfikowanych klas jednostek (na przykład klas z właściwościami nawigacji wirtualnej).
Aby uzyskać więcej informacji na temat tego tematu, przeczytaj sekcję dotyczącą leniwego ładowania.
Parametry w konstruktorach jednostek
Jeden z wymaganych elementów konstrukcyjnych do ładowania z opóźnieniem to umożliwienie tworzenia bytów, które przyjmują parametry w 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 tam i z powrotem między kolumnami a właściwościami bez żadnej zmiany. 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 enumów 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];
Zasiewanie 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żna użyć tego polecenia do skonfigurowania danych początkowych dla wpisu w 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 widoków bez kluczy podstawowych
- Mapowanie na tabele bez kluczy podstawowych
- Mapowanie na zapytania zdefiniowane w modelu
- Służący jako typ zwracany dla zapytań
FromSql()
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 metody Include
. W przypadku silnie typizowanej wersji Include
obsługujemy użycie jawnego rzutowania lub operatora as
. 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ę na temat dołączania z typami pochodnymi, aby uzyskać więcej informacji na ten temat.
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ą.
Przeczytaj sekcję dotyczącą System.Transactions, aby uzyskać więcej informacji na temat tego tematu.
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 EF Core nie może zmienić kolejności, gdy nowi członkowie są dodawani 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));
Uwzględniając ToListAsync()
we właściwym 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ść]
Teraz można skonfigurować typy jednostek należących do po prostu adnotując typ za pomocą [Owned]
i 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ą pakietu .NET Core SDK, więc nie będzie już konieczne użycie DotNetCliToolReference w projekcie, aby móc korzystać z migracji lub szkieleotwania 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 programu 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
Nowe zdarzenia Tracked
i StateChanged
na ChangeTracker
mogą służyć do pisania logiki, która reaguje na jednostki wchodzące do DbContext lub zmieniające swój 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ż 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ą niekompatybilność lub jakikolwiek problem w nowych funkcjach, lub masz na ich temat uwagi, zgłoś to przy użyciu naszego narzędzia do śledzenia zgłoszeń.