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ě DbConfigurationby 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řída DbContext . (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 MyProviderServicesMyConnectionFactory 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.