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#) neboFor Each
(Visual Basic). - Je vyčíslována operací shromažďování, jako
ToArray
je ,ToDictionary
neboToList
. - Operátory LINQ, jako
First
jsou neboAny
jsou uvedeny v nejkrajnější části dotazu. - Volá se jedna z následujících metod:
Load
rozšiřující metoda ,DbEntityEntry.Reload
Database.ExecuteSqlCommand
, aDbSet<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.