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 DbConfiguration
należ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 coDbContext
klasa. (Zobacz PrzeniesienieDbConfiguration
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 PrzenoszenieDbConfiguration
powyżej- Wywołaj statyczny
DbConfiguration
element . 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.