Praca z klasą DbContext
Aby używać programu Entity Framework do wykonywania zapytań, wstawiania, aktualizowania i usuwania danych przy użyciu obiektów platformy .NET, należy najpierw utworzyć model , który mapuje jednostki i relacje zdefiniowane w modelu na tabele w bazie danych.
Po utworzeniu modelu podstawowa klasa, z którą aplikacja wchodzi w interakcję, to System.Data.Entity.DbContext
(często nazywana klasą kontekstu). Do utworzenia modelu można użyć elementu DbContext skojarzonego z modelem:
- Pisanie i wykonywanie zapytań
- Materializowanie wyników zapytania jako obiektów jednostki
- Śledzenie zmian wprowadzonych w tych obiektach
- Utrwalanie zmian obiektu w bazie danych
- Wiązanie obiektów w pamięci z kontrolkami interfejsu użytkownika
Ta strona zawiera wskazówki dotyczące zarządzania klasą kontekstu.
Definiowanie klasy pochodnej DbContext
Zalecanym sposobem pracy z kontekstem jest zdefiniowanie klasy pochodzącej z elementu DbContext i uwidacznianie właściwości DbSet reprezentujących kolekcje określonych jednostek w kontekście. Jeśli pracujesz z Projektant EF, kontekst zostanie wygenerowany. Jeśli pracujesz z aplikacją Code First, zazwyczaj samodzielnie napiszesz kontekst.
public class ProductContext : DbContext
{
public DbSet<Category> Categories { get; set; }
public DbSet<Product> Products { get; set; }
}
Po utworzeniu kontekstu należy wykonać zapytanie dotyczące, dodać (przy użyciu Add
metod Attach
) lub usunąć (przy użyciu ) Remove
jednostki w kontekście za pomocą tych właściwości. Uzyskiwanie DbSet
dostępu do właściwości w obiekcie kontekstu reprezentuje zapytanie początkowe zwracające wszystkie jednostki określonego typu. Pamiętaj, że uzyskiwanie dostępu do właściwości nie spowoduje wykonania zapytania. Zapytanie jest wykonywane, gdy:
- Jest on wyliczany przez instrukcję
foreach
(C#) lubFor Each
(Visual Basic). - Jest on wyliczany przez operację kolekcji, taką jak
ToArray
,ToDictionary
lubToList
. - Operatory LINQ, takie jak
First
lubAny
, są określone w najbardziej zewnętrznej części zapytania. - Jedna z następujących metod jest wywoływana:
Load
metoda rozszerzenia,DbEntityEntry.Reload
,Database.ExecuteSqlCommand
iDbSet<T>.Find
, jeśli jednostka z określonym kluczem nie zostanie jeszcze załadowana w kontekście.
Okres istnienia
Okres istnienia kontekstu rozpoczyna się po utworzeniu wystąpienia i kończy się po usunięciu wystąpienia lub usunięciu pamięci. Użyj polecenia , jeśli chcesz, aby wszystkie zasoby, które kontrolki kontekstu mają być usuwane na końcu bloku. W przypadku użycia kompilator automatycznie tworzy blok try/finally i wywołuje metodę dispose w bloku końcu.
public void UseProducts()
{
using (var context = new ProductContext())
{
// Perform data access using the context
}
}
Poniżej przedstawiono niektóre ogólne wskazówki dotyczące podejmowania decyzji o okresie istnienia kontekstu:
- Podczas pracy z aplikacjami internetowymi użyj wystąpienia kontekstu na żądanie.
- Podczas pracy z programem Windows Presentation Foundation (WPF) lub Windows Forms użyj wystąpienia kontekstu na formularz. Dzięki temu można korzystać z funkcji śledzenia zmian dostępnych w kontekście.
- Jeśli wystąpienie kontekstu jest tworzone przez kontener iniekcji zależności, zwykle obowiązkiem kontenera jest usunięcie kontekstu.
- Jeśli kontekst jest tworzony w kodzie aplikacji, pamiętaj, aby usunąć kontekst, gdy nie jest już wymagany.
- Podczas pracy z długotrwałym kontekstem należy wziąć pod uwagę następujące kwestie:
- Podczas ładowania większej liczby obiektów i odwołań do pamięci zużycie pamięci może szybko wzrosnąć. Może to spowodować problemy z wydajnością.
- Kontekst nie jest bezpieczny wątkowo, dlatego nie powinien być współużytkowany w wielu wątkach wykonujących na nim pracę współbieżnie.
- Jeśli wyjątek powoduje, że kontekst jest w stanie nieodwracalnym, cała aplikacja może zakończyć działanie.
- Prawdopodobieństwo wystąpienia problemów związanych ze współbieżnością zwiększa się wraz ze wzrostem odstępu między czasem wykonywania zapytań dotyczących danych i aktualizowania.
Połączenia
Domyślnie kontekst zarządza połączeniami z bazą danych. Kontekst otwiera i zamyka połączenia zgodnie z potrzebami. Na przykład kontekst otwiera połączenie w celu wykonania zapytania, a następnie zamyka połączenie po przetworzeniu wszystkich zestawów wyników.
Istnieją przypadki, gdy chcesz mieć większą kontrolę nad otwarciem i zamknięciem połączenia. Na przykład podczas pracy z programem SQL Server Compact zaleca się utrzymywanie oddzielnego otwartego połączenia z bazą danych przez cały okres istnienia aplikacji w celu zwiększenia wydajności. Ten proces można zarządzać ręcznie przy użyciu Connection
właściwości .