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

Prozeduren, die allen Anwendungen gemeinsam sindProcedures Common to All Applications

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

  1. Aktualisieren die Zielplattform .NET von der Anwendung in eine Anwendung ein, die .NET Standard 2.0 unterstützt.Upgrading the target .NET platform of the application to one that supports .NET Standard 2.0. Finden Sie unter unterstützte Plattformen Weitere Details.See Supported Platforms for more details.

  2. Identifizieren Sie einen Anbieter für die Zieldatenbank mit EF Core 2.0 kompatibel sind.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 (Common Language Runtime und die Tools sind) auf 2.0.Upgrading all the EF Core packages (runtime and tooling) to 2.0. Finden Sie unter installieren EF Core Weitere Details.Refer to Installing EF Core for more details.

  4. Nehmen Sie Änderungen erforderlichen Code, für die aktuelle Änderungen zu kompensieren.Make any necessary code changes to compensate for breaking changes. Finden Sie unter der Breaking Changes weiter unten für weitere Details.See the Breaking Changes section below for more details.

ASP.NET Core-AnwendungenASP.NET Core applications

  1. Insbesondere finden Sie in der neues Muster für die Initialisierung der Anwendung Dienstanbieter unten beschriebenen.See in particular the new pattern for initializing the application's service provider described below.

Tipp

Die Übernahme von diesem neuen Muster beim Aktualisieren von Anwendungen auf 2.0 wird dringend empfohlen, und ist erforderlich, damit für Produktfeatures wie Entity Framework Core Migrationen 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 allgemeine andere Alternative besteht darin, implementieren IDesignTimeDbContextFactory<TContext >.The other common alternative is to implement IDesignTimeDbContextFactory<TContext>.

  1. Anwendungen für ASP.NET Core 2.0 können EF Core 2.0 ohne zusätzliche Abhängigkeiten neben dem Datenbank-Anbieter von Drittanbietern verwenden.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 zu ASP.NET Core 2.0 aktualisieren, um EF Core 2.0 zu 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 2.0 finden Sie unter der ASP.NET Core-Dokumentation auf der das Subjekt.For more details on upgrading ASP.NET Core applications to 2.0 see the ASP.NET Core documentation on the subject.

Die Lauffähigkeit der Anwendung beeinträchtigende ÄnderungenBreaking Changes

Wir haben die Möglichkeit, unsere vorhandener APIs und Verhaltensweisen in 2.0 erheblich optimieren ausgeführt.We have taken the opportunity to significantly refine our existing APIs and behaviors in 2.0. Es sind einige Verbesserungen, die erforderlich sein können, Ändern vorhandener Anwendungscode, obwohl wir, die für die meisten Anwendungen in der Meinung sind die Auswirkungen niedrig ist, in den meisten Fällen erfordern nur Neukompilierung und nur minimale kommentierte Änderungen an veraltete 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.

Neue Weise gelöschte AnwendungsdiensteNew way of getting application services

Das empfohlene Muster für ASP.NET Core Webanwendungen wurde für 2.0 auf eine Weise aktualisiert, die die Logik zur Entwurfszeit unterbrochen wurde, die EF Core 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. Zuvor zur Entwurfszeit, EF Core versuchen Sie, den aufzurufenden Startup.ConfigureServices direkt, um die Anwendung Dienstanbieter zugreifen.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, wird die Konfiguration außerhalb von initialisiert die Startup Klasse.In ASP.NET Core 2.0, Configuration is initialized outside of the Startup class. Anwendungen, die in der Regel mithilfe von EF Core zugreifen ihre Verbindungszeichenfolge aus der Konfiguration, 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, können Sie die folgende Fehlermeldung beim EF-Core-Tools verwenden.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'. Fügen Sie einen parameterlosen Konstruktor 'ApplicationContext' oder Hinzufügen einer Implementierung von "IDesignTimeDbContextFactory<ApplicationContext>" in der gleichen Assembly als "ApplicationContext"Either add a parameterless constructor to 'ApplicationContext' or add an implementation of 'IDesignTimeDbContextFactory<ApplicationContext>' in the same assembly as 'ApplicationContext'

Ein neuer zur 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 ermöglicht EF-Kerne und Zugriff auf den Dienstanbieter für die 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 Sie aktualisieren Program Klasse, um wie folgt aussehen.If you are upgrading an ASP.NET Core 1.x application, you will need to update you 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();
    }
}

IDbContextFactory umbenanntIDbContextFactory renamed

Um die verschiedenen Anwendungsmuster unterstützen und Benutzern besser steuern, wie ihre DbContext dient zur Entwurfszeit, wir haben, in der Vergangenheit bereitgestellten die 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 Implementierungen dieser Schnittstelle in Ihrem Projekt zu ermitteln, und verwenden sie zum Erstellen 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 hat einen sehr allgemeinen Name, die einige Benutzer versuchen, verwenden es erneut für andere 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 deaktivieren Guard abgefangen wird, wenn die Tools EF versucht hat, verwenden Sie ihre Implementierung zur Entwurfszeit 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 zur 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> noch vorhanden ist, jedoch wird als veraltet markiert.For the 2.0 release the IDbContextFactory<TContext> still exists but is marked as obsolete.

DbContextFactoryOptions entferntDbContextFactoryOptions removed

Aufgrund der oben beschriebenen Änderungen ASP.NET Core 2.0 wurde ermittelt, die DbContextFactoryOptions wurde nicht mehr benötigt, 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 verwendet werden sollte.Here are the alternatives you should be using instead.

DbContextFactoryOptionsDbContextFactoryOptions AlternativeAlternative
ApplicationBasePathApplicationBasePath AppContext.BaseDirectoryAppContext.BaseDirectory
ContentRootPathContentRootPath Directory.GetCurrentDirectory()Directory.GetCurrentDirectory()
EnvironmentNameEnvironmentName 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 von verwendeten Arbeitsverzeichnisses dotnet ef veröffentlichungshäufigkeit das 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. Eine Observable Nebeneffekt hiervon ist dieser SQLite Dateinamen wird jetzt relativ zum Projektverzeichnis und nicht in 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-Datenbank-AnbieterEF Core 2.0 requires a 2.0 database provider

Für EF Core 2.0 haben wir viele vereinfachungen und Verbesserungen in die Datenbankanbieter Weise funktionieren.For EF Core 2.0 we have made many simplifications and improvements in the way database providers work. Dies bedeutet, dass der Anbieter 1.0.x und 1.1.x mit EF Core 2.0 nicht funktionieren.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 Team EF ausgeliefert und 2.0-Versionen verfügbar als Teil der 2.0 freizugeben.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, um alle anderen Anbieter zu erhalten.For all other providers, please contact the provider writer.

Protokollierung und-Diagnose Ereignisse wurden geändert.Logging and Diagnostics events have changed

Hinweis: diese Änderungen sollte nicht Großteil des Anwendungscodes beeinträchtigt werden.Note: these changes should not impact most application code.

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

Kategorien von Protokollierung sich ebenfalls geändert haben.Logger categories have also changed. Wird nun Zugriff auf ein bekannter Satz von Kategorien über DbLoggerCategory.There is now a well-known set of categories accessed through DbLoggerCategory.

DiagnosticSource Ereignisse verwenden nun die gleichnamigen der Ereignis-ID als die entsprechenden ILogger Nachrichten.DiagnosticSource events now use the same event ID names as the corresponding ILogger messages. Die ereignisnutzlasten sind alle Nominale Typen abgeleitet EventData.The event payloads are all nominal types derived from EventData.

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

IDs verfügen auch vom Microsoft.EntityFrameworkCore.Infraestructure auf dem 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 wird jetzt erstellen Sie ein anderes IModel für jeden anderen Anbieter verwendet wird.EF Core 2.0 will now build a different IModel for each different provider being used. Dies ist in der Regel für die Anwendung transparent.This is usually transparent to the application. Dies hat eine Vereinfachung des Metadaten-APIs auf niedrigerer Ebene genutzt, sodass alle Zugriff auf allgemeine Metadatenkonzepte von relationalen erfolgt immer über einen Aufruf von .Relational anstelle von .SqlServer, .Sqliteusw. 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 z. B. ForSqlServerToTable, Erweiterungsmethoden stehen jetzt zur bedingten basierend auf den aktuellen Anbieter verwendet 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. spezifisch 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.

Keine Kontrolle des Dienstanbieters EFDon’t take control of the EF service provider

EF Kern verwendet eine interne IServiceProvider (d. h. einen abhängigkeitseinschleusungscontainer) für die interne Implementierung.EF Core uses an internal IServiceProvider (i.e. a dependency injection container) for its internal implementation. Anwendungen sollten EF Kern zu erstellen und Verwalten von diesem Anbieter außer in besonderen Fällen zulassen.Applications should allow EF Core to create and manage this provider except in special cases. Sollten Sie dringend, entfernen alle Aufrufe von UseInternalServiceProvider.Strongly consider removing any calls to UseInternalServiceProvider. Wenn eine Anwendung aufrufen muss UseInternalServiceProvider, dann erwägen Sie Ablegen eines Problems damit wir Möglichkeiten für Ihr Szenario zu behandeln, 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 seinIn-memory databases must be named

Die globalen unbenannte in-Memory-Datenbank wurde entfernt und stattdessen alle in-Memory-Datenbanken müssen benannt sein kann.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/wird eine Datenbank mit dem Namen "MyDatabase" verwendet.This creates/uses a database with the name “MyDatabase”. Wenn UseInMemoryDatabase erneut aufgerufen, mit dem gleichen Namen wird die gleiche in-Memory-Datenbank ermöglicht, die von mehreren Kontext Instanzen gemeinsam genutzt werden verwendet,.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, IsReadOnlyAferSave, und IsStoreGeneratedAlways akkumuliert und mit ersetzt wurden BeforeSaveBehavior und AfterSaveBehavior.IsReadOnlyBeforeSave, IsReadOnlyAferSave, 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 eine Datenbankzeile (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 gekennzeichnet ValueGenerated.OnAddOrUpdate (z. B. für berechnete Spalten) standardmäßig ignoriert ausnahmslos derzeit für die Eigenschaft festgelegt.Properties marked as ValueGenerated.OnAddOrUpdate (e.g. for computed columns) will by default ignore any value currently set on the property. Dies bedeutet, dass ein vom Speicher generierter Wert immer abgerufen werden kann, unabhängig davon, ob ausnahmslos festgelegt oder für 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öschverhaltensNew ClientSetNull delete behavior

In früheren Versionen DeleteBehavior.Restrict hatte ein Verhalten für Entitäten vom Kontext verfolgt, dass mehrere ü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 der EF Core 2.0 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 überwachten Entitäten und Restrict Verhalten für Datenbanken mit EF Core erstellt.This behavior has SetNull semantics for tracked entities and Restrict behavior for databases created using EF Core. In unserer Erfahrung sind dies die erwartet/nützlichsten Verhaltensweisen für nachverfolgte Objekte und die Datenbank.In our experience, these are the most expected/useful behaviors for tracked entities and the database. DeleteBehavior.Restrictwird jetzt für überwachten Entitäten, die bei der Einstellung für optionale Beziehungen berücksichtigt werden.DeleteBehavior.Restrict is now honored for tracked entities when set for optional relationships.

Anbieter während der Entwurfszeit Pakete entferntProvider design-time packages removed

Die Microsoft.EntityFrameworkCore.Relational.Design Paket entfernt wurde.The Microsoft.EntityFrameworkCore.Relational.Design package has been removed. Der Inhalt 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 Anbieter während der Entwurfszeit Pakete 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 Haupt-Anbieters Pakete zusammengefasst.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" />