Práce s DbContext

Abyste mohli pomocí entity Framework dotazovat, vkládat, aktualizovat a odstraňovat data pomocí objektů .NET, musíte nejprve vytvořit model , který mapuje entity a relace definované v modelu na tabulky v databázi.

Jakmile máte model, primární třída, se kterou vaše aplikace komunikuje, je System.Data.Entity.DbContext (často označovaná jako kontextová třída). K modelu můžete použít dbContext přidružený k:

  • Psaní a spouštění dotazů
  • Materializace výsledků dotazu jako objektů entity
  • Sledování změn provedených u těchto objektů
  • Zachování změn objektu zpět v databázi
  • Vytvoření vazby objektů v paměti k ovládacím prvkům uživatelského rozhraní

Na této stránce najdete pokyny ke správě třídy kontextu.

Definování odvozené třídy DbContext

Doporučeným způsobem práce s kontextem je definovat třídu, která je odvozena z DbContext a zveřejňuje vlastnosti DbSet, které představují kolekce zadaných entit v kontextu. Pokud pracujete s ef Designerem, kontext se za vás vygeneruje. Pokud pracujete s code First, obvykle napíšete kontext sami.

public class ProductContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}

Jakmile budete mít kontext, budete dotazovat, přidat (pomocí Add nebo Attach metody) nebo odebrat (pomocí Remove) entit v kontextu prostřednictvím těchto vlastností. DbSet Přístup k vlastnosti u objektu kontextu představuje počáteční dotaz, který vrátí všechny entity zadaného typu. Všimněte si, že pouze přístup k vlastnosti nespustí dotaz. Dotaz se spustí, když:

  • Je vyčíslován příkazem foreach (C#) nebo For Each (Visual Basic).
  • Je vyčíslována operací shromažďování, jako ToArrayje , ToDictionarynebo ToList.
  • Operátory LINQ, jako First jsou nebo Any jsou uvedeny v nejkrajnější části dotazu.
  • Volá se jedna z následujících metod: Load rozšiřující metoda , DbEntityEntry.ReloadDatabase.ExecuteSqlCommand, a DbSet<T>.Find, pokud entita se zadaným klíčem nebyla nalezena již načtena v kontextu.

Životnost

Doba života kontextu začíná při vytvoření instance a končí, když je instance uvolněna nebo uvolňování paměti. Použití použijte, pokud chcete, aby všechny prostředky, které ovládací prvky kontextu byly uvolněny na konci bloku. Při použití pomocí kompilátor automaticky vytvoří blok try/finally a zavolá v bloku finally.

public void UseProducts()
{
    using (var context = new ProductContext())
    {     
        // Perform data access using the context
    }
}

Tady jsou některé obecné pokyny při rozhodování o životnosti kontextu:

  • Při práci s webovými aplikacemi použijte instanci kontextu na požadavek.
  • Při práci se systémem Windows Presentation Foundation (WPF) nebo model Windows Forms použijte instanci kontextu na formulář. Díky tomu můžete používat funkce sledování změn, které tento kontext poskytuje.
  • Pokud je kontextová instance vytvořená kontejnerem injektáže závislostí, je obvykle odpovědností kontejneru odstranit kontext.
  • Pokud je kontext vytvořen v kódu aplikace, nezapomeňte odstranit kontext, pokud už není vyžadován.
  • Při práci s dlouhotrvajícím kontextem zvažte následující:
    • Při načítání více objektů a jejich odkazů do paměti se může spotřeba paměti kontextu rychle zvýšit. To může způsobit problémy s výkonem.
    • Kontext není bezpečný pro přístup z více vláken, proto by se neměl sdílet mezi více vlákny, které na něm souběžně pracují.
    • Pokud výjimka způsobí, že kontext bude v neobnovitelném stavu, může celá aplikace ukončit.
    • Pravděpodobnost, že dojde k problémům souvisejícím s souběžností, se zvyšuje, protože dochází k mezerě mezi časem, kdy se data dotazují a aktualizují.

Připojení

Ve výchozím nastavení spravuje kontext připojení k databázi. Kontext se otevře a podle potřeby ukončí připojení. Kontext například otevře připojení, aby se spustil dotaz, a potom připojení zavře, když byly zpracovány všechny sady výsledků.

Existují případy, kdy chcete mít větší kontrolu nad tím, kdy se připojení otevře a zavře. Například při práci s SQL ServerEm Compact se často doporučuje udržovat samostatné otevřené připojení k databázi po celou dobu životnosti aplikace, aby se zlepšil výkon. Tento proces můžete spravovat ručně pomocí Connection vlastnosti.