Konfiguracja oparta na kodzie

Uwaga

Tylko rozwiązanie EF6 i nowsze wersje — Funkcje, interfejsy API itp. omówione na tej stronie zostały wprowadzone w rozwiązaniu Entity Framework 6. Jeśli korzystasz ze starszej wersji, niektóre lub wszystkie podane informacje nie mają zastosowania.

Konfigurację aplikacji Platformy Entity Framework można określić w pliku konfiguracji (app.config/web.config) lub za pomocą kodu. Ten ostatni jest nazywany konfiguracją opartą na kodzie.

Konfiguracja w pliku konfiguracji jest opisana w osobnym artykule. Plik konfiguracji ma pierwszeństwo przed konfiguracją opartą na kodzie. Innymi słowy, jeśli opcja konfiguracji jest ustawiona zarówno w kodzie, jak i w pliku konfiguracji, jest używane ustawienie w pliku konfiguracji.

Za pomocą DbConfiguration

Konfiguracja oparta na kodzie w programie EF6 i nowszych jest osiągana przez utworzenie podklasy .System.Data.Entity.Config.DbConfiguration Podczas podklasowania DbConfigurationnależy przestrzegać następujących wskazówek:

  • Utwórz tylko jedną DbConfiguration klasę dla aplikacji. Ta klasa określa ustawienia dla całej domeny aplikacji.
  • Umieść klasę DbConfiguration w tym samym zestawie co DbContext klasa. (Zobacz Przeniesienie DbConfiguration sekcji, jeśli chcesz to zmienić).
  • Nadaj DbConfiguration klasie publiczny konstruktor bez parametrów.
  • Ustaw opcje konfiguracji, wywołując metody chronione DbConfiguration z poziomu tego konstruktora.

Zgodnie z tymi wytycznymi platforma EF umożliwia automatyczne odnajdywanie konfiguracji i korzystanie z nich przez narzędzia, które muszą uzyskiwać dostęp do modelu i po uruchomieniu aplikacji.

Przykład

Klasa pochodząca z DbConfiguration klasy może wyglądać następująco:

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"));
        }
    }
}

Ta klasa konfiguruje program EF do używania strategii wykonywania Usługi SQL Azure — aby automatycznie ponowić nieudane operacje bazy danych — i użyć lokalnej bazy danych dla baz danych utworzonych zgodnie z konwencją z code first.

Przenoszenie DbConfiguration

Istnieją przypadki, w których nie można umieścić DbConfiguration klasy w tym samym zestawie co DbContext klasa. Na przykład mogą istnieć dwie DbContext klasy w różnych zestawach. Istnieją dwie opcje obsługi tego.

Pierwszą opcją jest użycie pliku konfiguracji w celu określenia DbConfiguration wystąpienia do użycia. W tym celu ustaw atrybut codeConfigurationType sekcji entityFramework. Przykład:

<entityFramework codeConfigurationType="MyNamespace.MyDbConfiguration, MyAssembly">
    ...Your EF config...
</entityFramework>

Wartość codeConfigurationType musi być kwalifikowaną nazwą zestawu i przestrzeni nazw klasy DbConfiguration .

Drugą opcją jest umieszczenie DbConfigurationTypeAttribute jej w klasie kontekstu. Przykład:

[DbConfigurationType(typeof(MyDbConfiguration))]
public class MyContextContext : DbContext
{
}

Wartość przekazana do atrybutu może być twoim DbConfiguration typem — jak pokazano powyżej — lub ciągiem nazwy kwalifikowanego typu zestawu i przestrzeni nazw. Przykład:

[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssembly")]
public class MyContextContext : DbContext
{
}

Jawne ustawianie DbConfiguration

Istnieją pewne sytuacje, w których konfiguracja może być potrzebna przed zastosowaniem dowolnego DbContext typu. Oto przykłady:

  • Używanie DbModelBuilder do kompilowania modelu bez kontekstu
  • Użycie innego kodu platformy/narzędzia, który wykorzystuje DbContext miejsce, w którym jest używany kontekst przed użyciem kontekstu aplikacji

W takich sytuacjach program EF nie może automatycznie odnaleźć konfiguracji i zamiast tego należy wykonać jedną z następujących czynności:

  • DbConfiguration Ustaw typ w pliku konfiguracji, zgodnie z opisem w sekcji Przenoszenie DbConfiguration powyżej
  • Wywołaj statyczny DbConfigurationelement . SetConfiguration, metoda podczas uruchamiania aplikacji

Zastępowanie DbConfiguration

Istnieją sytuacje, w których należy zastąpić konfigurację ustawioną w pliku DbConfiguration. Nie jest to zwykle wykonywane przez deweloperów aplikacji, ale przez dostawców innych firm i wtyczek, które nie mogą używać klasy pochodnej DbConfiguration .

W tym celu element EntityFramework umożliwia zarejestrowanie programu obsługi zdarzeń, który może modyfikować istniejącą konfigurację tuż przed jego zablokowaniem. Zapewnia również metodę cukru przeznaczoną do zastępowania wszystkich usług zwracanych przez lokalizator usług EF. W ten sposób ma być używany:

  • Podczas uruchamiania aplikacji (przed użyciem programu EF) wtyczka lub dostawca powinien zarejestrować metodę obsługi zdarzeń dla tego zdarzenia. (Należy pamiętać, że musi się to zdarzyć, zanim aplikacja będzie używać programu EF).
  • Procedura obsługi zdarzeń wywołuje metodę ReplaceService dla każdej usługi, która musi zostać zastąpiona.

Na przykład, aby zastąpić IDbConnectionFactory element i DbProviderService zarejestrować program obsługi podobny do następującego:

DbConfiguration.Loaded += (_, a) =>
   {
       a.ReplaceService<DbProviderServices>((s, k) => new MyProviderServices(s));
       a.ReplaceService<IDbConnectionFactory>((s, k) => new MyConnectionFactory(s));
   };

W powyższym MyProviderServices kodzie i MyConnectionFactory reprezentują implementacje usługi.

Możesz również dodać dodatkowe programy obsługi zależności, aby uzyskać ten sam efekt.

Należy pamiętać, że można również zawinąć DbProviderFactory w ten sposób, ale będzie to miało wpływ tylko na ef i nie będzie używać DbProviderFactory poza EF. Z tego powodu prawdopodobnie zechcesz kontynuować opakowywanie DbProviderFactory , tak jak wcześniej.

Należy również pamiętać o usługach uruchamianych zewnętrznie w aplikacji — na przykład podczas uruchamiania migracji z konsoli Menedżer pakietów. Po uruchomieniu migracji z konsoli program podejmie próbę znalezienia pliku DbConfiguration. Jednak niezależnie od tego, czy usługa zostanie opakowana, zależy od tego, gdzie zarejestrowano program obsługi zdarzeń. Jeśli jest on zarejestrowany w ramach budowy, DbConfiguration kod powinien zostać wykonany, a usługa powinna zostać opakowana. Zwykle tak nie będzie i oznacza to, że narzędzia nie będą otrzymywać opakowanej usługi.