Praca z 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). Można używać DbContext skojarzonego z modelem, aby:

  • 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 Projektantem EF, kontekst zostanie wygenerowany dla Ciebie. 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, dodać (przy użyciu metody Add lub Attach) lub usunąć (przy użyciu Remove) jednostki w kontekście za pomocą tych właściwości. Dostęp do właściwości DbSet w obiekcie kontekstu rozpoczyna zapytanie, które zwraca wszystkie encje 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#) lub For Each (Visual Basic).
  • Jest on wyliczany przez operację kolekcji, taką jak ToArray, ToDictionarylub ToList.
  • Operatory LINQ, takie jak First lub Any , są określone w najbardziej zewnętrznej części zapytania.
  • Wywoływana jest jedna z następujących metod: Load metoda rozszerzenia, DbEntityEntry.Reload, Database.ExecuteSqlCommand, i DbSet<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 using, jeśli chcesz, aby wszystkie zasoby kontrolowane przez kontekst były zwalniane na końcu bloku kodu. W przypadku using kompilator automatycznie tworzy blok try/finally i wywołuje metodę dispose w bloku finally.

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 należy używać wystąpienia kontekstu dla każdego żądania.
  • Podczas pracy z programem Windows Presentation Foundation (WPF) lub Windows Forms użyj wystąpienia kontekstu dla każdego formularza. Dzięki temu można korzystać z funkcji śledzenia zmian dostępnych w kontekście.
  • Jeśli wystąpienie kontekstu jest tworzone przez kontener do 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:
    • W miarę ładowania do pamięci większej liczby obiektów i ich odwołań, zużycie pamięci przez kontekst może szybko wzrosnąć. Może to spowodować problemy z wydajnością.
    • Kontekst nie jest bezpieczny dla wątków, dlatego nie powinien być współużytkowany w wielu wątkach wykonujących na nim pracę jednocześ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.

Connections

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 .