Ustawienia pliku konfiguracji
Program Entity Framework umożliwia określenie wielu ustawień z pliku konfiguracji. Ogólnie rzecz biorąc, program EF jest zgodny z zasadą "konwencji dotyczącej konfiguracji": wszystkie ustawienia omówione w tym wpisie mają zachowanie domyślne, musisz martwić się tylko o zmianę ustawienia, gdy wartość domyślna nie spełnia już wymagań.
Wytyczne dotyczące danych konfiguracji
- Nigdy nie przechowuj haseł ani innych poufnych danych w kodzie dostawcy konfiguracji ani w plikach konfiguracji w postaci zwykłego tekstu.
- Nie używaj wpisów tajnych produkcji w środowiskach tworzenia ani testowania.
- Określaj wpisy tajne poza projektem, aby nie można było ich przypadkowo zatwierdzić w repozytorium kodu źródłowego.
- Rozważ ochronę zawartości pliku konfiguracji przy użyciu chronionej konfiguracji.
Ostrzeżenie
W tym artykule jest używana lokalna baza danych, która nie wymaga uwierzytelnienia użytkownika. Aplikacje produkcyjne powinny korzystać z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Aby uzyskać więcej informacji na temat uwierzytelniania dla wdrożonych aplikacji testowych i produkcyjnych, zobacz Bezpieczne przepływy uwierzytelniania.
Alternatywa oparta na kodzie
Wszystkie te ustawienia można również zastosować przy użyciu kodu. Począwszy od platformy EF6 wprowadziliśmy konfigurację opartą na kodzie, która zapewnia centralny sposób stosowania konfiguracji z kodu. Przed ef6 nadal można zastosować konfigurację z kodu, ale musisz użyć różnych interfejsów API do skonfigurowania różnych obszarów. Opcja pliku konfiguracji umożliwia łatwe zmianę tych ustawień podczas wdrażania bez aktualizowania kodu.
Sekcja Konfiguracja programu Entity Framework
Począwszy od programu EF4.1, można ustawić inicjator bazy danych dla kontekstu przy użyciu sekcji appSettings pliku konfiguracji. W programie EF 4.3 wprowadziliśmy sekcję entityFramework niestandardową w celu obsługi nowych ustawień. Program Entity Framework nadal rozpoznaje inicjatory baz danych ustawione przy użyciu starego formatu, ale zalecamy przejście do nowego formatu, jeśli to możliwe.
Sekcja entityFramework została automatycznie dodana do pliku konfiguracji projektu podczas instalowania pakietu NuGet EntityFramework.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework"
type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
</configuration>
Parametry połączenia
Ta strona zawiera więcej szczegółów na temat sposobu określania używanej bazy danych przez program Entity Framework, w tym parametry połączenia w pliku konfiguracji.
Parametry połączenia są dostępne w standardowym elemecie connectionStrings i nie wymagają sekcji entityFramework .
Modele oparte na kodzie First używają normalnych ADO.NET parametry połączenia. Na przykład:
<connectionStrings>
<add name="BlogContext"
providerName="System.Data.SqlClient"
connectionString="Server=.\SQLEXPRESS;Database=Blogging;Integrated Security=True;"/>
</connectionStrings>
Modele oparte na programie EF Designer używają specjalnych parametry połączenia EF. Na przykład:
<connectionStrings>
<add name="BlogContext"
connectionString=
"metadata=
res://*/BloggingModel.csdl|
res://*/BloggingModel.ssdl|
res://*/BloggingModel.msl;
provider=System.Data.SqlClient;
provider connection string=
"data source=(localdb)\mssqllocaldb;
initial catalog=Blogging;
integrated security=True;
multipleactiveresultsets=True;""
providerName="System.Data.EntityClient" />
</connectionStrings>
Typ konfiguracji oparty na kodzie (EF6 onwards)
Począwszy od platformy EF6, możesz określić element DbConfiguration dla programu EF do użycia na potrzeby konfiguracji opartej na kodzie w aplikacji. W większości przypadków nie trzeba określać tego ustawienia, ponieważ program EF automatycznie odnajdzie twoją konfigurację DbConfiguration. Aby uzyskać szczegółowe informacje o tym, kiedy może być konieczne określenie elementu DbConfiguration w pliku konfiguracji, zobacz sekcję Moving DbConfiguration w sekcji Konfiguracja oparta na kodzie.
Aby ustawić typ DbConfiguration, należy określić kwalifikowaną nazwę typu zestawu w elemecie codeConfigurationType .
Uwaga
Kwalifikowana nazwa zestawu to kwalifikowana nazwa przestrzeni nazw, po której następuje przecinek, a następnie zestaw, w którym znajduje się typ. Opcjonalnie można również określić wersję zestawu, kulturę i token klucza publicznego.
<entityFramework codeConfigurationType="MyNamespace.MyConfiguration, MyAssembly">
</entityFramework>
Dostawcy bazy danych EF (EF6 w wersji nowszej)
Przed ef6, elementy specyficzne dla programu Entity Framework dostawcy bazy danych musiały zostać uwzględnione jako część podstawowego dostawcy ADO.NET. Począwszy od ef6, określone części ef są teraz zarządzane i rejestrowane oddzielnie.
Zwykle nie trzeba samodzielnie rejestrować dostawców. Zazwyczaj jest to wykonywane przez dostawcę podczas jego instalowania.
Dostawcy są zarejestrowani przez dołączenie elementu dostawcy w sekcji podrzędnej dostawców w sekcji entityFramework. Istnieją dwa wymagane atrybuty dla wpisu dostawcy:
- invariantName identyfikuje podstawowego dostawcę ADO.NET, którego dotyczy ten dostawca ef
- type to kwalifikowana nazwa typu zestawu implementacji dostawcy EF
Uwaga
Kwalifikowana nazwa zestawu to kwalifikowana nazwa przestrzeni nazw, po której następuje przecinek, a następnie zestaw, w którym znajduje się typ. Opcjonalnie można również określić wersję zestawu, kulturę i token klucza publicznego.
Oto przykładowy wpis utworzony w celu zarejestrowania domyślnego dostawcy programu SQL Server podczas instalowania programu Entity Framework.
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
Przechwytniki (EF6.1 do wewnątrz)
Począwszy od ef6.1 można zarejestrować przechwytniki w pliku konfiguracji. Przechwytniki umożliwiają uruchamianie dodatkowej logiki, gdy ef wykonuje określone operacje, takie jak wykonywanie zapytań bazy danych, otwieranie połączeń itp.
Przechwytniki są rejestrowane przez dołączenie elementu przechwytywania w sekcji podrzędnej przechwytywania w sekcji entityFramework. Na przykład poniższa konfiguracja rejestruje wbudowany przechwytnika DatabaseLogger , który będzie rejestrować wszystkie operacje bazy danych w konsoli programu .
<interceptors>
<interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"/>
</interceptors>
Rejestrowanie operacji bazy danych w pliku (od wersji EF6.1)
Rejestrowanie przechwytujących za pośrednictwem pliku konfiguracji jest szczególnie przydatne, gdy chcesz dodać rejestrowanie do istniejącej aplikacji, aby pomóc w debugowaniu problemu. Usługa DatabaseLogger obsługuje rejestrowanie w pliku przez podanie nazwy pliku jako parametru konstruktora.
<interceptors>
<interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
<parameters>
<parameter value="C:\Temp\LogOutput.txt"/>
</parameters>
</interceptor>
</interceptors>
Domyślnie spowoduje to zastąpienie pliku dziennika nowym plikiem przy każdym uruchomieniu aplikacji. Aby zamiast tego dołączyć do pliku dziennika, jeśli już istnieje, użyj czegoś takiego jak:
<interceptors>
<interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
<parameters>
<parameter value="C:\Temp\LogOutput.txt"/>
<parameter value="true" type="System.Boolean"/>
</parameters>
</interceptor>
</interceptors>
Aby uzyskać dodatkowe informacje na temat programu DatabaseLogger i rejestrowania przechwytywania, zobacz wpis w blogu EF 6.1: Włączanie rejestrowania bez ponownego komplikowania.
Domyślna fabryka połączeń Code First
Sekcja konfiguracji umożliwia określenie domyślnej fabryki połączeń, której należy użyć w celu zlokalizowania bazy danych do użycia w kontekście. Domyślna fabryka połączeń jest używana tylko wtedy, gdy nie dodano parametry połączenia do pliku konfiguracji dla kontekstu.
Po zainstalowaniu pakietu EF NuGet zarejestrowano domyślną fabrykę połączeń wskazującą program SQL Express lub LocalDB, w zależności od zainstalowanego pakietu.
Aby ustawić fabrykę połączeń, należy określić kwalifikowaną nazwę typu zestawu w domyślnym elemektorzeConnectionFactory.
Uwaga
Kwalifikowana nazwa zestawu to kwalifikowana nazwa przestrzeni nazw, po której następuje przecinek, a następnie zestaw, w którym znajduje się typ. Opcjonalnie można również określić wersję zestawu, kulturę i token klucza publicznego.
Oto przykład ustawienia własnej domyślnej fabryki połączeń:
<entityFramework>
<defaultConnectionFactory type="MyNamespace.MyCustomFactory, MyAssembly"/>
</entityFramework>
Powyższy przykład wymaga, aby fabryka niestandardowa miała konstruktor bez parametrów. W razie potrzeby można określić parametry konstruktora przy użyciu elementu parameters .
Na przykład sqlCeConnectionFactory, który jest zawarty w programie Entity Framework, wymaga podania niezmiennej nazwy dostawcy do konstruktora. Niezmienna nazwa dostawcy identyfikuje wersję programu SQL Compact, której chcesz użyć. Poniższa konfiguracja spowoduje, że konteksty będą domyślnie używać programu SQL Compact w wersji 4.0.
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
<parameters>
<parameter value="System.Data.SqlServerCe.4.0" />
</parameters>
</defaultConnectionFactory>
</entityFramework>
Jeśli nie ustawisz domyślnej fabryki połączeń, funkcja Code First używa elementu SqlConnectionFactory, wskazując wartość .\SQLEXPRESS
. SqlConnectionFactory ma również konstruktor, który umożliwia zastąpienie części parametry połączenia. Jeśli chcesz użyć wystąpienia programu SQL Server innego niż .\SQLEXPRESS
ten konstruktor, aby ustawić serwer.
Poniższa konfiguracja spowoduje, że funkcja Code First będzie używać serwera MyDatabaseServer dla kontekstów, które nie mają jawnego zestawu parametry połączenia.
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<parameter value="Data Source=MyDatabaseServer; Integrated Security=True; MultipleActiveResultSets=True" />
</parameters>
</defaultConnectionFactory>
</entityFramework>
Domyślnie zakłada się, że argumenty konstruktora są ciągiem typu. Aby to zmienić, możesz użyć atrybutu type.
<parameter value="2" type="System.Int32" />
Inicjatory bazy danych
Inicjatory baz danych są konfigurowane dla poszczególnych kontekstów. Można je ustawić w pliku konfiguracji przy użyciu elementu kontekstu . Ten element używa kwalifikowanej nazwy zestawu do identyfikowania skonfigurowanego kontekstu.
Domyślnie konteksty Code First są skonfigurowane do używania inicjatora CreateDatabaseIfNotExists. Istnieje atrybut disableDatabaseInitialization elementu kontekstu, który może służyć do wyłączania inicjowania bazy danych.
Na przykład poniższa konfiguracja wyłącza inicjowanie bazy danych dla kontekstu Blogging.BlogContext zdefiniowanego w MyAssembly.dll.
<contexts>
<context type=" Blogging.BlogContext, MyAssembly" disableDatabaseInitialization="true" />
</contexts>
Możesz użyć elementu databaseInitializer , aby ustawić inicjator niestandardowy.
<contexts>
<context type=" Blogging.BlogContext, MyAssembly">
<databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly" />
</context>
</contexts>
Parametry konstruktora używają tej samej składni co domyślne fabryki połączeń.
<contexts>
<context type=" Blogging.BlogContext, MyAssembly">
<databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly">
<parameters>
<parameter value="MyConstructorParameter" />
</parameters>
</databaseInitializer>
</context>
</contexts>
Można skonfigurować jeden z ogólnych inicjatorów baz danych, które są zawarte w programie Entity Framework. Atrybut type używa formatu .NET Framework dla typów ogólnych.
Jeśli na przykład używasz Migracje Code First, możesz skonfigurować bazę danych do automatycznego migrowania przy użyciu inicjatoraMigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>
.
<contexts>
<context type="Blogging.BlogContext, MyAssembly">
<databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Blogging.BlogContext, MyAssembly], [Blogging.Migrations.Configuration, MyAssembly]], EntityFramework" />
</context>
</contexts>