Konfigurace založená na kódu
Poznámka
Pouze EF6 a novější – Funkce, rozhraní API atd. popsané na této stránce byly představeny v Entity Framework 6. Pokud používáte starší verzi, některé nebo všechny informace nemusí být platné.
Konfiguraci pro aplikaci Entity Framework je možné zadat v konfiguračním souboru (app.config/web.config) nebo prostřednictvím kódu. Tato konfigurace se označuje jako konfigurace založená na kódu.
Konfigurace v konfiguračním souboru je popsaná v samostatném článku. Konfigurační soubor má přednost před konfigurací založenou na kódu. Jinými slovy, pokud je možnost konfigurace nastavena v kódu i v konfiguračním souboru, použije se nastavení v konfiguračním souboru.
Pomocí DbConfiguration
Konfigurace založená na kódu v EF6 a vyšší se dosahuje vytvořením podtřídy System.Data.Entity.Config.DbConfiguration
. Při podtřídě DbConfiguration
by se měly dodržovat následující pokyny:
- Vytvořte pouze jednu
DbConfiguration
třídu pro vaši aplikaci. Tato třída určuje nastavení pro celou doménu aplikace. - Umístěte třídu
DbConfiguration
do stejného sestavení jako třídaDbContext
. (Viz PřesunutíDbConfiguration
oddílu, pokud to chcete změnit.) - Dejte třídě
DbConfiguration
veřejný konstruktor bez parametrů. - Nastavte možnosti konfigurace voláním chráněných
DbConfiguration
metod z tohoto konstruktoru.
Podle těchto pokynů ef umožňuje automaticky zjišťovat a používat konfiguraci pomocí nástrojů, které potřebují přístup k vašemu modelu a při spuštění aplikace.
Příklad
Třída odvozená z DbConfiguration
může vypadat takto:
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.SqlServer;
namespace MyNamespace
{
public class MyConfiguration : DbConfiguration
{
public MyConfiguration()
{
SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
SetDefaultConnectionFactory(new LocalDbConnectionFactory("mssqllocaldb"));
}
}
}
Tato třída nastaví EF tak, aby používala strategii spouštění SQL Azure – k automatickému opakování neúspěšných databázových operací – a k použití místní databáze pro databáze vytvořené konvencí z code First.
Pohybující DbConfiguration
Existují případy, kdy není možné umístit třídu DbConfiguration
do stejného sestavení jako vaše DbContext
třída. Můžete mít například dvě DbContext
třídy v různých sestaveních. Existují dvě možnosti pro zpracování.
První možností je použít konfigurační soubor k určení DbConfiguration
instance, která se má použít. Uděláte to tak, že nastavíte atribut codeConfigurationType oddílu entityFramework. Příklad:
<entityFramework codeConfigurationType="MyNamespace.MyDbConfiguration, MyAssembly">
...Your EF config...
</entityFramework>
Hodnota codeConfigurationType musí být sestavení a obor názvů kvalifikovaný název vaší DbConfiguration
třídy.
Druhou možností je umístit DbConfigurationTypeAttribute
do třídy kontextu. Příklad:
[DbConfigurationType(typeof(MyDbConfiguration))]
public class MyContextContext : DbContext
{
}
Hodnota předaná atributu může být buď váš DbConfiguration
typ , jak je uvedeno výše, nebo řetězec názvu kvalifikovaného názvu sestavení a oboru názvů. Příklad:
[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssembly")]
public class MyContextContext : DbContext
{
}
Explicitní nastavení DbConfiguration
V některých situacích může být potřeba konfigurace před jakýmkoli DbContext
typem. Mezi příklady patří:
- Použití
DbModelBuilder
k sestavení modelu bez kontextu - Použití jiného kódu architektury nebo nástroje, který využívá
DbContext
místo, kde se tento kontext používá před použitím kontextu aplikace
V takových situacích ef nemůže automaticky zjistit konfiguraci a místo toho musíte udělat jednu z těchto věcí:
DbConfiguration
Nastavte typ v konfiguračním souboru, jak je popsáno v části PřesunutíDbConfiguration
výše.- Zavolejte statickou
DbConfiguration
. Metoda SetConfiguration při spuštění aplikace
Přepsání DbConfiguration
V některých situacích je potřeba přepsat konfiguraci nastavenou v nástroji DbConfiguration
. To obvykle neprovozují vývojáři aplikací, ale spíše poskytovatelé třetích stran a moduly plug-in, které nemůžou používat odvozenou DbConfiguration
třídu.
V tomto případě EntityFramework umožňuje registraci obslužné rutiny události, která může upravit existující konfiguraci těsně před uzamčením. Poskytuje také metodu cukru speciálně pro nahrazení všech služeb vrácených lokátorem služby EF. Tímto způsobem se má použít:
- Při spuštění aplikace (před používáním EF) by měl modul plug-in nebo poskytovatel zaregistrovat metodu obslužné rutiny události pro tuto událost. (Upozorňujeme, že k tomu musí dojít dříve, než aplikace použije EF.)
- Obslužná rutina události volá ReplaceService pro každou službu, která musí být nahrazena.
Pokud chcete například nahradit IDbConnectionFactory
a DbProviderService
zaregistrovat obslužnou rutinu, která by vypadala nějak takto:
DbConfiguration.Loaded += (_, a) =>
{
a.ReplaceService<DbProviderServices>((s, k) => new MyProviderServices(s));
a.ReplaceService<IDbConnectionFactory>((s, k) => new MyConnectionFactory(s));
};
Ve výše uvedeném MyProviderServices
MyConnectionFactory
kódu představuje vaše implementace služby.
Můžete také přidat další obslužné rutiny závislostí pro získání stejného efektu.
Všimněte si, že tímto způsobem můžete také zabalit DbProviderFactory
, ale to ovlivní pouze EF a nebude se používat DbProviderFactory
mimo EF. Z tohoto důvodu budete pravděpodobně chtít pokračovat v zabalení DbProviderFactory
jako předtím.
Měli byste také mít na paměti služby, které spouštíte externě ve své aplikaci – například při spouštění migrací z konzoly Správce balíčků. Když spustíte migraci z konzoly, pokusí se ji najít DbConfiguration
. Jestli ale zabalená služba získá nebo ne, závisí na tom, kde obslužná rutina události byla zaregistrována. Pokud je zaregistrovaný jako součást konstrukce vašeho DbConfiguration
kódu, měl by se kód spustit a služba by se měla zabalit. Obvykle to nebude případ a znamená to, že nástroje nebudou mít zabalenou službu.