Aktualisieren von Anwendungen aus früheren Versionen auf EF Core 2.0Upgrading applications from previous versions to EF Core 2.0

Habe ich die Möglichkeit, unsere vorhandenen APIs und Verhalten in 2.0 erheblich optimieren.We have taken the opportunity to significantly refine our existing APIs and behaviors in 2.0. Es gibt einige Verbesserungen, die erfordern, vorhandenen Code der Anwendung ändern können, obwohl wir, die für die meisten Anwendungen sind der Meinung die Auswirkungen niedrig ist, in den meisten Fällen erfordert nur eine Neukompilierung und nur minimale geführte Änderungen an die veralteten APIs zu ersetzen.There are a few improvements that can require modifying existing application code, although we believe that for the majority of applications the impact will be low, in most cases requiring just recompilation and minimal guided changes to replace obsolete APIs.

Aktualisieren einer vorhandenen Anwendung auf EF Core 2.0 erfordern:Updating an existing application to EF Core 2.0 may require:

  1. Aktualisieren die Ziel .NET Implementierung der Anwendung auf einen ein, die .NET Standard 2.0 unterstützt.Upgrading the target .NET implementation of the application to one that supports .NET Standard 2.0. Finden Sie unter unterstützt .NET Implementierungen Weitere Details.See Supported .NET Implementations for more details.

  2. Identifizieren Sie einen Anbieter für die Zieldatenbank, die mit EF Core 2.0 kompatibel ist.Identify a provider for the target database which is compatible with EF Core 2.0. Finden Sie unter EF Core 2.0 erfordert einen 2.0 Datenbankanbieter unten.See EF Core 2.0 requires a 2.0 database provider below.

  3. Aktualisieren alle EF Core-Pakete ("Runtime" und "Tools") auf 2.0 an.Upgrading all the EF Core packages (runtime and tooling) to 2.0. Finden Sie unter Installieren von EF Core Weitere Details.Refer to Installing EF Core for more details.

  4. Stellen Sie alle notwendige codeänderungen, um die Änderungen, die im weiteren Verlauf dieses Dokuments beschrieben zu kompensieren.Make any necessary code changes to compensate for the breaking changes described in the rest of this document.

ASP.NET Core enthält nun EF CoreASP.NET Core now includes EF Core

Anwendungen, deren Zielversionen für ASP.NET Core 2.0 festgelegt sind, können neben Datenbankanbietern von Drittanbietern EF Core 2.0 ohne zusätzliche Abhängigkeiten nutzen.Applications targeting ASP.NET Core 2.0 can use EF Core 2.0 without additional dependencies besides third party database providers. Allerdings müssen Anwendungen, die für frühere Versionen von ASP.NET Core auf ASP.NET Core 2.0 aktualisieren, um EF Core 2.0 verwenden.However, applications targeting previous versions of ASP.NET Core need to upgrade to ASP.NET Core 2.0 in order to use EF Core 2.0. Weitere Informationen zum Aktualisieren von ASP.NET Core-Anwendungen auf 2.0 finden Sie Dokumentation zu ASP.NET Core zu diesem Thema.For more details on upgrading ASP.NET Core applications to 2.0 see the ASP.NET Core documentation on the subject.

Neuen Weg, Dienste der Anwendung in ASP.NET CoreNew way of getting application services in ASP.NET Core

Das empfohlene Muster für ASP.NET Core-Webanwendungen wurde für 2.0 so aktualisiert, die die Logik zur Entwurfszeit unterbrochen wurde, die EF Core in 1.x verwendet.The recommended pattern for ASP.NET Core web applications has been updated for 2.0 in a way that broke the design-time logic EF Core used in 1.x. Zur Entwurfszeit verwendet wird, würde EF Core zuvor aufzurufende versuchen Startup.ConfigureServices direkt, um Zugriff auf den Dienstanbieter für der Anwendung.Previously at design-time, EF Core would try to invoke Startup.ConfigureServices directly in order to access the application's service provider. In ASP.NET Core 2.0-Konfiguration wird initialisiert, außerhalb von den Startup Klasse.In ASP.NET Core 2.0, Configuration is initialized outside of the Startup class. Anwendungen, die Verwendung von EF Core in der Regel greifen Sie auf ihre Verbindungszeichenfolge aus der Konfiguration, also Startup allein reicht nicht mehr.Applications using EF Core typically access their connection string from Configuration, so Startup by itself is no longer sufficient. Wenn Sie eine ASP.NET Core 1.x-Anwendung aktualisieren, erhalten Sie den folgenden Fehler, bei Verwendung der EF Core-Tools.If you upgrade an ASP.NET Core 1.x application, you may receive the following error when using the EF Core tools.

Auf 'ApplicationContext' wurde kein parameterloser Konstruktor gefunden.No parameterless constructor was found on 'ApplicationContext'. "ApplicationContext" einen parameterlosen Konstruktor hinzu, oder fügen Sie eine Implementierung von "IDesignTimeDbContextFactory<ApplicationContext>" in der gleichen Assembly wie "ApplicationContext"Either add a parameterless constructor to 'ApplicationContext' or add an implementation of 'IDesignTimeDbContextFactory<ApplicationContext>' in the same assembly as 'ApplicationContext'

Ein neuer während der Entwurfszeit-Hook wurde in ASP.NET Core 2.0-Standardvorlage hinzugefügt.A new design-time hook has been added in ASP.NET Core 2.0's default template. Die statische Program.BuildWebHost Methode können Sie EF Core zum Zugriff auf den Dienstanbieter für der Anwendung zur Entwurfszeit.The static Program.BuildWebHost method enables EF Core to access the application's service provider at design time. Wenn Sie eine ASP.NET Core 1.x-Anwendung aktualisieren, müssen Sie zum Aktualisieren der Program Klasse, der wie folgt aussehen.If you are upgrading an ASP.NET Core 1.x application, you will need to update the Program class to resemble the following.

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace AspNetCoreDotNetCore2._0App
{
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }
}

Die Einführung von diesem neuen Muster, wenn Anwendungen auf 2.0 aktualisieren, dringend empfohlen wird und, damit für Produktfunktionen wie Entity Framework Core-Migrationen erforderlich ist funktioniert.The adoption of this new pattern when updating applications to 2.0 is highly recommended and is required in order for product features like Entity Framework Core Migrations to work. Die andere häufige Alternative ist die implementieren IDesignTimeDbContextFactory<TContext >.The other common alternative is to implement IDesignTimeDbContextFactory<TContext>.

IDbContextFactory umbenanntIDbContextFactory renamed

Um verschiedene Anwendungsmuster zu unterstützen und Benutzern steuern, wie ihre DbContext dient zur Entwurfszeit, wir haben, in der Vergangenheit bereitgestellten der IDbContextFactory<TContext> Schnittstelle.In order to support diverse application patterns and give users more control over how their DbContext is used at design time, we have, in the past, provided the IDbContextFactory<TContext> interface. Zur Entwurfszeit verwendet wird, die EF Core-Tools ermittelt Implementierungen dieser Schnittstelle in Ihrem Projekt und zum Erstellen von DbContext Objekte.At design-time, the EF Core tools will discover implementations of this interface in your project and use it to create DbContext objects.

Diese Schnittstelle hatte einen sehr allgemeinen Namen, die einige versuchen erneut für andere Benutzer irreführen DbContext-Szenarien zu erstellen.This interface had a very general name which mislead some users to try re-using it for other DbContext-creating scenarios. Sie bei der EF-Tools versucht hat, verwenden Sie ihre Implementierung zur Entwurfszeit cloudsupport- und Befehle wie verursacht wurden Update-Database oder dotnet ef database update fehlschlägt.They were caught off guard when the EF Tools then tried to use their implementation at design-time and caused commands like Update-Database or dotnet ef database update to fail.

Um die starke während der Entwurfszeit-Semantik dieser Schnittstelle kommunizieren zu können, haben wir es umbenannt IDesignTimeDbContextFactory<TContext>.In order to communicate the strong design-time semantics of this interface, we have renamed it to IDesignTimeDbContextFactory<TContext>.

Version 2.0 der IDbContextFactory<TContext> weiterhin vorhanden, aber als veraltet markiert ist.For the 2.0 release the IDbContextFactory<TContext> still exists but is marked as obsolete.

DbContextFactoryOptions entfernt.DbContextFactoryOptions removed

Aufgrund der oben beschriebenen Änderungen ASP.NET Core 2.0 gefunden, die DbContextFactoryOptions war nicht mehr erforderlich, auf dem neuen IDesignTimeDbContextFactory<TContext> Schnittstelle.Because of the ASP.NET Core 2.0 changes described above, we found that DbContextFactoryOptions was no longer needed on the new IDesignTimeDbContextFactory<TContext> interface. Hier sind die alternativen, die Sie stattdessen verwenden sollten.Here are the alternatives you should be using instead.

DbContextFactoryOptionsDbContextFactoryOptions AlternativeAlternative
ApplicationBasePathApplicationBasePath AppContext.BaseDirectoryAppContext.BaseDirectory
ContentRootPathContentRootPath Directory.GetCurrentDirectory()Directory.GetCurrentDirectory()
UmgebungsnameEnvironmentName Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")

Während der Entwurfszeit-Arbeitsverzeichnis geändertDesign-time working directory changed

Die ASP.NET Core 2.0-Änderungen muss auch das Arbeitsverzeichnis ein, die dotnet ef an das mit dem Arbeitsverzeichnis, von Visual Studio verwendet werden, wenn die Anwendung ausgeführt.The ASP.NET Core 2.0 changes also required the working directory used by dotnet ef to align with the working directory used by Visual Studio when running your application. Ein Observable Nebeneffekt davon ist, SQLite, Dateinamen wird jetzt relativ zum Verzeichnis des Projekts und nicht das Ausgabeverzeichnis sind, wie sie verwendet werden.One observable side effect of this is that SQLite filenames are now relative to the project directory and not the output directory like they used to be.

EF Core 2.0 erfordert einen 2.0-AnbieterEF Core 2.0 requires a 2.0 database provider

Für EF Core 2.0 haben wir viele vereinfachungen und Verbesserungen in den Anbietern Weise vorgenommen.For EF Core 2.0 we have made many simplifications and improvements in the way database providers work. Dies bedeutet, dass 1.0.x, und 1.1.x Anbieter nicht mit EF Core 2.0 funktioniert.This means that 1.0.x and 1.1.x providers will not work with EF Core 2.0.

Die SQL Server- und SQLite-Anbieter werden vom EF-Team geliefert und 2.0-Versionen stehen als Teil der 2.0-Version.The SQL Server and SQLite providers are shipped by the EF team and 2.0 versions will be available as part of the 2.0 release. Die Open-Source-Drittanbieter-Anbieter für SQL Compact, PostgreSQL, und MySQL für 2.0 aktualisiert werden.The open-source third party providers for SQL Compact, PostgreSQL, and MySQL are being updated for 2.0. Wenden Sie sich an den Anbieterwriter, für alle anderen Anbieter zu erhalten.For all other providers, please contact the provider writer.

Protokollierung und Diagnose-Ereignissen haben sich geändert.Logging and Diagnostics events have changed

Hinweis: diese Änderungen sollten keine Auswirkungen auf den Großteil des Anwendungscodes.Note: these changes should not impact most application code.

Die Ereignis-IDs für Nachrichten an eine "ILogger" wurden in 2.0 geändert.The event IDs for messages sent to an ILogger have changed in 2.0. Die Ereignis-IDs sind nun für alle EF Core-Codes eindeutig.The event IDs are now unique across EF Core code. Diese Nachrichten entsprechen nun auch dem Standardmuster für die strukturierte Protokollierung, das z.B. von MVC eingesetzt wird.These messages now also follow the standard pattern for structured logging used by, for example, MVC.

Die Protokollierungskategorien haben sich ebenfalls geändert.Logger categories have also changed. Nun gibt es eine bekannte Gruppe von Kategorien, auf die über DbLoggerCategory zugegriffen werden kann.There is now a well-known set of categories accessed through DbLoggerCategory.

DiagnosticSource Ereignisse verwenden nun dieselben Ereignis-ID-Namen wie die entsprechende ILogger Nachrichten.DiagnosticSource events now use the same event ID names as the corresponding ILogger messages. Die ereignisnutzlasten sind alle Nominale Typen, die von abgeleiteten EventData.The event payloads are all nominal types derived from EventData.

Ereignis-IDs, Nutzlasttypen und Kategorien sind dokumentiert, der CoreEventId und RelationalEventId Klassen.Event IDs, payload types, and categories are documented in the CoreEventId and the RelationalEventId classes.

IDs wurden auch von Microsoft.EntityFrameworkCore.Infraestructure um den neuen Microsoft.EntityFrameworkCore.Diagnostics-Namespace verschoben.IDs have also moved from Microsoft.EntityFrameworkCore.Infraestructure to the new Microsoft.EntityFrameworkCore.Diagnostics namespace.

EF Core relationalen Metadaten-API-ÄnderungenEF Core relational metadata API changes

EF Core 2.0 erstellt nun eine andere IModel-Klasse für die verschiedenen verwendeten Anbieter.EF Core 2.0 will now build a different IModel for each different provider being used. Dies geschieht in der Regel auf eine für die Anwendung transparente Weise.This is usually transparent to the application. Dies hat eine Vereinfachung der untergeordneten Metadaten-APIs ermöglicht, sodass Zugriffe auf gemeinsame relationale Metadatenkonzepte immer durch Aufrufen von .Relational statt .SqlServer, .Sqlite usw. erfolgen. Z. B. 1.1.x Code wie folgt:This has facilitated a simplification of lower-level metadata APIs such that any access to common relational metadata concepts is always made through a call to .Relational instead of .SqlServer, .Sqlite, etc. For example, 1.1.x code like this:

var tableName = context.Model.FindEntityType(typeof(User)).SqlServer().TableName;

Sollte jetzt wie folgt geschrieben werden:Should now be written like this:

var tableName = context.Model.FindEntityType(typeof(User)).Relational().TableName;

Statt Methoden wie ForSqlServerToTable, Erweiterungsmethoden sind jetzt verfügbar, bedingten basierten auf den aktuellen Anbieter verwendeten Code zu schreiben.Instead of using methods like ForSqlServerToTable, extension methods are now available to write conditional code based on the current provider in use. Zum Beispiel:For example:

modelBuilder.Entity<User>().ToTable(
    Database.IsSqlServer() ? "SqlServerName" : "OtherName");

Beachten Sie, die diese Änderung gilt nur für APIs/Metadaten, die für definiert ist alle relationalen Anbieter.Note that this change only applies to APIs/metadata that is defined for all relational providers. Die API und die Metadaten bleibt unverändert, wenn es nur einen einzelnen Anbieter spezifisch ist.The API and metadata remains the same when it is specific to only a single provider. Gruppierte Indizes sind z. B. für SQL Server, damit ForSqlServerIsClustered und .SqlServer().IsClustered() müssen immer noch verwendet werden.For example, clustered indexes are specific to SQL Sever, so ForSqlServerIsClustered and .SqlServer().IsClustered() must still be used.

Nicht die Kontrolle über den EF-DienstanbieterDon’t take control of the EF service provider

EF Core verwendet ein internes IServiceProvider (DI-Containern) für die interne Implementierung.EF Core uses an internal IServiceProvider (a dependency injection container) for its internal implementation. Anwendungen sollten die EF Core zum Erstellen und Verwalten von diesem Anbieter nur in besonderen Fällen ermöglichen.Applications should allow EF Core to create and manage this provider except in special cases. Sollten Sie alle Aufrufe von entfernen UseInternalServiceProvider.Strongly consider removing any calls to UseInternalServiceProvider. Wenn eine Anwendung aufrufen muss UseInternalServiceProvider, dann erwägen erstellen ein Problem , damit es andere Möglichkeiten zum Behandeln von Ihrem Szenarios untersuchen können.If an application does need to call UseInternalServiceProvider, then please consider filing an issue so we can investigate other ways to handle your scenario.

Aufrufen von AddEntityFramework, AddEntityFrameworkSqlServer, usw. ist nicht vom Anwendungscode erforderlich, es sei denn, UseInternalServiceProvider wird auch als bezeichnet.Calling AddEntityFramework, AddEntityFrameworkSqlServer, etc. is not required by application code unless UseInternalServiceProvider is also called. Entfernen Sie alle vorhandenen Aufrufe AddEntityFramework oder AddEntityFrameworkSqlServerusw. AddDbContext sollte weiterhin verwendet werden auf die gleiche Weise wie zuvor.Remove any existing calls to AddEntityFramework or AddEntityFrameworkSqlServer, etc. AddDbContext should still be used in the same way as before.

In-Memory-Datenbanken müssen benannt werdenIn-memory databases must be named

Globale unbenannte in-Memory-Datenbank wurde entfernt und stattdessen müssen alle in-Memory-Datenbanken den Namen.The global unnamed in-memory database has been removed and instead all in-memory databases must be named. Zum Beispiel:For example:

optionsBuilder.UseInMemoryDatabase("MyDatabase");

Dies erstellt/verwendet eine Datenbank mit dem Namen "MyDatabase".This creates/uses a database with the name “MyDatabase”. Wenn UseInMemoryDatabase erneut aufgerufen, mit dem gleichen Namen, die gleiche in-Memory-Datenbank verwendet werden wird, ermöglicht mehrere kontextinstanzen freigegeben werden.If UseInMemoryDatabase is called again with the same name, then the same in-memory database will be used, allowing it to be shared by multiple context instances.

Nur-Lese API-ÄnderungenRead-only API changes

IsReadOnlyBeforeSave, IsReadOnlyAfterSave, und IsStoreGeneratedAlways "ist veraltet und durch ersetzt wurden BeforeSaveBehavior und AfterSaveBehavior.IsReadOnlyBeforeSave, IsReadOnlyAfterSave, and IsStoreGeneratedAlways have been obsoleted and replaced with BeforeSaveBehavior and AfterSaveBehavior. Dieses Verhalten gelten für jede Eigenschaft (nicht nur vom Speicher generierte Eigenschaften) und zu bestimmen, wie der Wert der Eigenschaft verwendet werden soll, beim Einfügen in die Zeile in einer Datenbank (BeforeSaveBehavior) oder beim Aktualisieren einer vorhandenen Zeile (AfterSaveBehavior).These behaviors apply to any property (not only store-generated properties) and determine how the value of the property should be used when inserting into a database row (BeforeSaveBehavior) or when updating an existing database row (AfterSaveBehavior).

Eigenschaften, die als markiert ValueGenerated.OnAddOrUpdate (z. B. für berechnete Spalten) werden standardmäßig alle derzeit für die Eigenschaft festgelegten Wert ignoriert.Properties marked as ValueGenerated.OnAddOrUpdate (for example, for computed columns) will by default ignore any value currently set on the property. Dies bedeutet, dass ein Wert vom Speicher generierte immer abgerufen werden wird, unabhängig davon, ob einen beliebigen Wert festgelegt oder auf die nachverfolgte Entität geändert wurde.This means that a store-generated value will always be obtained regardless of whether any value has been set or modified on the tracked entity. Dies kann geändert werden, durch Festlegen einer anderen Before\AfterSaveBehavior.This can be changed by setting a different Before\AfterSaveBehavior.

Neue ClientSetNull LöschverhaltenNew ClientSetNull delete behavior

In früheren Versionen DeleteBehavior.Restrict hatte ein Verhalten für Entitäten vom Kontext nachverfolgt, dass weitere übereinstimmende geschlossen SetNull Semantik.In previous releases, DeleteBehavior.Restrict had a behavior for entities tracked by the context that more closed matched SetNull semantics. In EF Core 2.0 wird ein neues ClientSetNull Verhalten wurde als Standard für optionale Beziehungen eingeführt.In EF Core 2.0, a new ClientSetNull behavior has been introduced as the default for optional relationships. Dieses Verhalten hat SetNull Semantik für nachverfolgte Entitäten und Restrict Verhalten für Datenbanken mit Entity Framework Core erstellt.This behavior has SetNull semantics for tracked entities and Restrict behavior for databases created using EF Core. Erfahrungsgemäß sind die erwarteten/nützlichsten Verhaltensweisen für nachverfolgte Entitäten und die Datenbank.In our experience, these are the most expected/useful behaviors for tracked entities and the database. DeleteBehavior.Restrict wird jetzt für nachverfolgte Entitäten, die bei Festlegung für optionale Beziehungen berücksichtigt werden.DeleteBehavior.Restrict is now honored for tracked entities when set for optional relationships.

Während der Entwurfszeit anbieterpakete entferntProvider design-time packages removed

Die Microsoft.EntityFrameworkCore.Relational.Design Paket entfernt wurde.The Microsoft.EntityFrameworkCore.Relational.Design package has been removed. Inhalten konsolidiert wurden Microsoft.EntityFrameworkCore.Relational und Microsoft.EntityFrameworkCore.Design.It's contents were consolidated into Microsoft.EntityFrameworkCore.Relational and Microsoft.EntityFrameworkCore.Design.

Dies wird in der Entwurfszeit-anbieterpakete weitergegeben.This propagates into the provider design-time packages. Diese Pakete (Microsoft.EntityFrameworkCore.Sqlite.Design, Microsoft.EntityFrameworkCore.SqlServer.Designusw.) entfernt wurden und deren Inhalt in die wichtigsten anbieterpakete konsolidiert.Those packages (Microsoft.EntityFrameworkCore.Sqlite.Design, Microsoft.EntityFrameworkCore.SqlServer.Design, etc.) were removed and their contents consolidated into the main provider packages.

So aktivieren Sie Scaffold-DbContext oder dotnet ef dbcontext scaffold in EF Core 2.0 müssen Sie nur das Paket für die einzelnen Anbieter zu verweisen:To enable Scaffold-DbContext or dotnet ef dbcontext scaffold in EF Core 2.0, you only need to reference the single provider package:

<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer"
    Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools"
    Version="2.0.0"
    PrivateAssets="All" />
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet"
    Version="2.0.0" />