Uaktualnianie aplikacji z poprzedniej wersji do programu EF Core 2.0Upgrading applications from previous versions to EF Core 2.0

Podejmujemy szansy sprzedaży, aby znacznie udoskonalić naszych istniejących interfejsów API i zachowań w wersji 2.0.We have taken the opportunity to significantly refine our existing APIs and behaviors in 2.0. Istnieje kilka ulepszeń, które mogą wymagać od modyfikowania istniejącego kodu aplikacji, ale uważamy, że dla większości aplikacji wpływ będzie niska, w większości przypadków wymaga podania tylko ponownej kompilacji i minimalnych zmianach z przewodnikiem, aby zastąpić przestarzałe interfejsy API.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.

Aktualizowanie istniejącej aplikacji do programu EF Core 2.0 mogą wymagać:Updating an existing application to EF Core 2.0 may require:

  1. Uaktualnianie wdrożenia .NET docelowej aplikacji obsługującej .NET Standard 2.0.Upgrading the target .NET implementation of the application to one that supports .NET Standard 2.0. Zobacz obsługiwane implementacje platformy .NET Aby uzyskać więcej informacji.See Supported .NET Implementations for more details.

  2. Określ dostawcę dla docelowej bazy danych, które są zgodne z programem EF Core 2.0.Identify a provider for the target database which is compatible with EF Core 2.0. Zobacz EF Core 2.0 wymaga dostawcy bazy danych 2.0 poniżej.See EF Core 2.0 requires a 2.0 database provider below.

  3. Uaktualnienie wszystkich pakietów programu EF Core (środowiska uruchomieniowego i narzędzi) do wersji 2.0.Upgrading all the EF Core packages (runtime and tooling) to 2.0. Zapoznaj się Instalowanie programu EF Core Aby uzyskać więcej informacji.Refer to Installing EF Core for more details.

  4. Wprowadź wszelkie zmiany niezbędny kod w celu kompensacji przełomowe zmiany opisane w dalszej części tego dokumentu.Make any necessary code changes to compensate for the breaking changes described in the rest of this document.

Platforma ASP.NET Core zawiera teraz EF CoreASP.NET Core now includes EF Core

Aplikacje przeznaczone na platformy ASP.NET Core 2.0 mogą używać programu EF Core 2.0 bez dodatkowe zależności oprócz dostawcy bazy danych.Applications targeting ASP.NET Core 2.0 can use EF Core 2.0 without additional dependencies besides third party database providers. Jednak aplikacje przeznaczone na poprzednie wersje platformy ASP.NET Core konieczne uaktualnienie do programu ASP.NET Core 2.0, aby można było używać programu EF Core 2.0.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. Aby uzyskać więcej informacji na temat uaktualniania aplikacji platformy ASP.NET Core 2.0, zobacz dokumentacji platformy ASP.NET Core na ten temat.For more details on upgrading ASP.NET Core applications to 2.0 see the ASP.NET Core documentation on the subject.

Nowy sposób, w jakim usługi aplikacji w programie ASP.NET CoreNew way of getting application services in ASP.NET Core

Zaktualizowano zalecany wzorzec dla aplikacji sieci web platformy ASP.NET Core 2.0 w taki sposób, że Przerwano logiki czasu projektowania, jakie programu EF Core w 1.x.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. Wcześniej w czasie projektowania programu EF Core będzie spróbować ponownie wywołać Startup.ConfigureServices bezpośrednio po to, aby uzyskać dostęp do aplikacji dostawcy usług.Previously at design-time, EF Core would try to invoke Startup.ConfigureServices directly in order to access the application's service provider. W programie ASP.NET Core 2.0 konfiguracji jest inicjowany poza Startup klasy.In ASP.NET Core 2.0, Configuration is initialized outside of the Startup class. Aplikacje zazwyczaj przy użyciu programu EF Core uzyskiwać dostęp do swoich parametrów połączenia z konfiguracji, więc Startup przez siebie nie jest już wystarczająca.Applications using EF Core typically access their connection string from Configuration, so Startup by itself is no longer sufficient. Jeśli zaktualizujesz aplikację ASP.NET Core 1.x, otrzymasz następujący błąd podczas korzystania z narzędzi programu EF Core.If you upgrade an ASP.NET Core 1.x application, you may receive the following error when using the EF Core tools.

Żaden konstruktor bez parametrów nie został odnaleziony w "ApplicationContext".No parameterless constructor was found on 'ApplicationContext'. Dodaj konstruktor bez parametrów do "ApplicationContext" lub Dodaj implementację "IDesignTimeDbContextFactory<ApplicationContext>" z tego samego zestawu jako "ApplicationContext"Either add a parameterless constructor to 'ApplicationContext' or add an implementation of 'IDesignTimeDbContextFactory<ApplicationContext>' in the same assembly as 'ApplicationContext'

Nowe hook czasu projektowania został dodany w szablonie domyślnego programu ASP.NET Core 2.0.A new design-time hook has been added in ASP.NET Core 2.0's default template. Statyczne Program.BuildWebHost metoda umożliwia programu EF Core dostępu do aplikacji usługi dostawcy w czasie projektowania.The static Program.BuildWebHost method enables EF Core to access the application's service provider at design time. Jeśli uaktualniasz aplikacji ASP.NET Core 1.x należy zaktualizować Program klasy na podobny do następującego.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();
    }
}

Przyjęcie tego nowego wzorca podczas aktualizowania aplikacji w wersji 2.0 zdecydowanie zaleca się i jest wymagane dla funkcji produktów, takich jak migracje Entity Framework Core pracować.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. Powszechną alternatywą jest zaimplementować IDesignTimeDbContextFactory<TContext >.The other common alternative is to implement IDesignTimeDbContextFactory<TContext>.

Zmieniono nazwę IDbContextFactoryIDbContextFactory renamed

W celu obsługi wzorców dla różnych aplikacji i udostępniać użytkownikom większą kontrolę nad jak ich DbContext jest używany w czasie projektowania, mamy, w przeszłości, pod warunkiem IDbContextFactory<TContext> interfejsu.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. W czasie projektowania, narzędzi programu EF Core odnajdzie implementacje tego interfejsu w projekcie i użyć go do utworzenia DbContext obiektów.At design-time, the EF Core tools will discover implementations of this interface in your project and use it to create DbContext objects.

Ten interfejs ma bardzo ogólne nazwy, która wprowadzać w błąd niektórych użytkowników, aby spróbować ponownie go dla innych DbContext— tworzenie scenariuszy.This interface had a very general name which mislead some users to try re-using it for other DbContext-creating scenarios. Były one przechwytywane wyłączona ochrona, gdy narzędzia EF następnie dotarła do ich wykonania w czasie projektowania i spowodowane poleceń, takich jak Update-Database lub dotnet ef database update nie powiedzie się.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.

Aby komunikować się z silną semantyką czasu projektowania tego interfejsu, zmieniono jego IDesignTimeDbContextFactory<TContext>.In order to communicate the strong design-time semantics of this interface, we have renamed it to IDesignTimeDbContextFactory<TContext>.

Dla wersji 2.0 wersji IDbContextFactory<TContext> nadal istnieje, ale jest oznaczony jako przestarzały.For the 2.0 release the IDbContextFactory<TContext> still exists but is marked as obsolete.

DbContextFactoryOptions usunięteDbContextFactoryOptions removed

Ze względu na zmiany ASP.NET Core 2.0, opisane powyżej, Odkryliśmy, że DbContextFactoryOptions został nie będą już potrzebne w nowym IDesignTimeDbContextFactory<TContext> interfejsu.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. Poniżej przedstawiono rozwiązań alternatywnych, z których powinien być używany zamiast tego.Here are the alternatives you should be using instead.

DbContextFactoryOptionsDbContextFactoryOptions AlternatywnaAlternative
ApplicationBasePathApplicationBasePath AppContext.BaseDirectoryAppContext.BaseDirectory
ContentRootPathContentRootPath Directory.GetCurrentDirectory()Directory.GetCurrentDirectory()
EnvironmentNameEnvironmentName Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")

Katalog roboczy czasu projektowania został zmienionyDesign-time working directory changed

Katalog roboczy używany przez również wymaganych zmian platformy ASP.NET Core 2.0 dotnet ef wyrównać katalog roboczy używany przez program Visual Studio, podczas uruchamiania aplikacji.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. Jeden dostrzegalnych efekt uboczny tej jest tej bazy danych SQLite nazwy plików są teraz względem katalogu projektu, a nie katalog wyjściowy jak kiedyś.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 wymaga dostawcy 2.0 bazy danychEF Core 2.0 requires a 2.0 database provider

EF Core 2.0 wprowadzono wiele definiowaniu i ulepszeń w dostawcy baz danych w sposób pracy.For EF Core 2.0 we have made many simplifications and improvements in the way database providers work. Oznacza to, że dostawcy 1.0.x i 1.1.x, nie będą działać przy użyciu programu EF Core 2.0.This means that 1.0.x and 1.1.x providers will not work with EF Core 2.0.

Dostawcy programu SQL Server i bazy danych SQLite są dostarczane przez zespół programu EF i wersji 2.0 będzie dostępna w wersji 2.0 w ramach wersji.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. Dostawcy typu open-source innych firm dla SQL Compact, PostgreSQL, i MySQL są aktualizowane dla wersji 2.0.The open-source third party providers for SQL Compact, PostgreSQL, and MySQL are being updated for 2.0. W przypadku innych dostawców, skontaktuj się z modułu zapisującego dostawcy.For all other providers, please contact the provider writer.

Zmieniono zdarzenia rejestrowania i diagnostykiLogging and Diagnostics events have changed

Uwaga: te zmiany nie powinien wpływać na większość kodu aplikacji.Note: these changes should not impact most application code.

Komunikaty wysyłane do identyfikatorów zdarzeń ILogger zostały zmienione w wersji 2.0.The event IDs for messages sent to an ILogger have changed in 2.0. Identyfikatory zdarzeń obecnie są unikatowe w obrębie kod programem EF Core.The event IDs are now unique across EF Core code. Te komunikaty teraz również wykonać standardowego wzorca dla rejestrowaniem strukturalnym używane przez, na przykład MVC.These messages now also follow the standard pattern for structured logging used by, for example, MVC.

Kategorie rejestratora również zostały zmienione.Logger categories have also changed. Ma teraz dobrze znanego zestawu kategorii dostępne za pośrednictwem DbLoggerCategory.There is now a well-known set of categories accessed through DbLoggerCategory.

DiagnosticSource zdarzenia teraz użyć takich samych nazwach identyfikator zdarzenia odpowiadającego ILogger wiadomości.DiagnosticSource events now use the same event ID names as the corresponding ILogger messages. Ładunki zdarzeń są wszystkie typy nominalna pochodną EventData.The event payloads are all nominal types derived from EventData.

Identyfikatory zdarzeń, typy ładunku i kategorie są udokumentowane w CoreEventId i RelationalEventId klasy.Event IDs, payload types, and categories are documented in the CoreEventId and the RelationalEventId classes.

Identyfikatory również zostały przeniesione z Microsoft.EntityFrameworkCore.Infraestructure do nowej przestrzeni nazw Microsoft.EntityFrameworkCore.Diagnostics.IDs have also moved from Microsoft.EntityFrameworkCore.Infraestructure to the new Microsoft.EntityFrameworkCore.Diagnostics namespace.

EF Core relacyjnych metadanych interfejsu API zmianyEF Core relational metadata API changes

EF Core 2.0 będą teraz tworzyć inną IModel dla każdego innego dostawcy używane.EF Core 2.0 will now build a different IModel for each different provider being used. Jest to zazwyczaj niewidoczna dla aplikacji.This is usually transparent to the application. Ma to ułatwione uproszczenia metadanych niskiego poziomu interfejsy API, taki sposób, że dowolny dostęp do typowe pojęcia relacyjnych metadanych zawsze jest wykonywane za pomocą wywołania .Relational zamiast .SqlServer, .Sqliteitp. Na przykład 1.1.x kod następująco: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;

Powinny teraz być zapisany jako:Should now be written like this:

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

Zamiast używać metod, takich jak ForSqlServerToTable, metody rozszerzające są teraz dostępne do zapisu kod warunkowy, w oparciu o bieżący Dostawca używany.Instead of using methods like ForSqlServerToTable, extension methods are now available to write conditional code based on the current provider in use. Na przykład:For example:

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

Należy zauważyć, że ta zmiana ma zastosowanie tylko do interfejsów API/metadanych, który jest zdefiniowany dla wszystkich relacyjnych dostawców.Note that this change only applies to APIs/metadata that is defined for all relational providers. Interfejs API i metadanych pozostaje taki sam, gdy jest ona specyficzne dla tylko jednego dostawcę.The API and metadata remains the same when it is specific to only a single provider. Na przykład klastrowanych indeksów są specyficzne dla SQL Server, dzięki czemu ForSqlServerIsClustered i .SqlServer().IsClustered() nadal muszą być używane.For example, clustered indexes are specific to SQL Sever, so ForSqlServerIsClustered and .SqlServer().IsClustered() must still be used.

Nie przejąć kontrolę nad EF dostawcy usługDon’t take control of the EF service provider

EF Core używa wewnętrznego IServiceProvider (kontener iniekcji zależności) do swojej wewnętrznej implementacji.EF Core uses an internal IServiceProvider (a dependency injection container) for its internal implementation. Aplikacje powinny zezwalać programu EF Core utworzyć i zarządzać tego dostawcy, z wyjątkiem w szczególnych przypadkach.Applications should allow EF Core to create and manage this provider except in special cases. Zdecydowanie rozważyć usunięcie wszelkie wywołania UseInternalServiceProvider.Strongly consider removing any calls to UseInternalServiceProvider. Jeśli aplikacja musi wywołać UseInternalServiceProvider, należy rozważyć rejestrując problem , dzięki czemu firma Microsoft można zbadać inne sposoby obsługi danego scenariusza.If an application does need to call UseInternalServiceProvider, then please consider filing an issue so we can investigate other ways to handle your scenario.

Wywoływanie AddEntityFramework, AddEntityFrameworkSqlServer, itp. nie jest wymagane przez kod aplikacji, chyba że UseInternalServiceProvider skrót.Calling AddEntityFramework, AddEntityFrameworkSqlServer, etc. is not required by application code unless UseInternalServiceProvider is also called. Usuń wszystkie istniejące wywołania AddEntityFramework lub AddEntityFrameworkSqlServeritd AddDbContext należy nadal używać w taki sam sposób jak wcześniej.Remove any existing calls to AddEntityFramework or AddEntityFrameworkSqlServer, etc. AddDbContext should still be used in the same way as before.

Musi mieć nazwę bazy danych w pamięciIn-memory databases must be named

Globalne bez nazwy bazy danych w pamięci została usunięta, a zamiast tego muszą nosić wszystkich baz danych w pamięci.The global unnamed in-memory database has been removed and instead all in-memory databases must be named. Na przykład:For example:

optionsBuilder.UseInMemoryDatabase("MyDatabase");

To tworzy/używa bazy danych o nazwie "Moja_baza_danych".This creates/uses a database with the name “MyDatabase”. Jeśli UseInMemoryDatabase wywoływana jest ponownie o takiej samej nazwie tej samej bazy danych w pamięci zostanie użyta, dzięki któremu być współużytkowane przez wiele wystąpień kontekstu.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.

Zmiany interfejsu API tylko do odczytuRead-only API changes

IsReadOnlyBeforeSave, IsReadOnlyAfterSave, i IsStoreGeneratedAlways zdezaktualizowane i zastąpione BeforeSaveBehavior i AfterSaveBehavior.IsReadOnlyBeforeSave, IsReadOnlyAfterSave, and IsStoreGeneratedAlways have been obsoleted and replaced with BeforeSaveBehavior and AfterSaveBehavior. Te zachowania mają zastosowanie do wszystkich właściwości (nie tylko generowane przez Magazyn właściwości) i określić, jak wartość właściwości powinna być używana w przypadku wstawiania do wiersza bazy danych (BeforeSaveBehavior) lub podczas aktualizowania istniejącej bazy danych wiersza (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).

Właściwości są oznaczone jako ValueGenerated.OnAddOrUpdate (na przykład w przypadku kolumn obliczanych) domyślnie zignoruje dowolną wartość aktualnie ustawiona we właściwości.Properties marked as ValueGenerated.OnAddOrUpdate (for example, for computed columns) will by default ignore any value currently set on the property. Oznacza to, że wygenerowana przez Magazyn wartość, zawsze można uzyskać niezależnie od tego, czy dowolną wartość ma ustawić lub zmodyfikować śledzonych jednostki.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. Można to zmienić, ustawiając inną Before\AfterSaveBehavior.This can be changed by setting a different Before\AfterSaveBehavior.

Nowe zachowanie dotyczące usuwania ClientSetNullNew ClientSetNull delete behavior

W poprzednich wersjach DeleteBehavior.Restrict miał zachowanie w przypadku jednostek śledzone przez kontekst, jeden zamknięty dopasowane SetNull semantyki.In previous releases, DeleteBehavior.Restrict had a behavior for entities tracked by the context that more closed matched SetNull semantics. W programie EF Core 2.0 nową ClientSetNull zachowanie została wprowadzona jako domyślne dla relacji opcjonalne.In EF Core 2.0, a new ClientSetNull behavior has been introduced as the default for optional relationships. To zachowanie ma SetNull semantyki śledzonych jednostek i Restrict zachowanie dla baz danych utworzonych przy użyciu programu EF Core.This behavior has SetNull semantics for tracked entities and Restrict behavior for databases created using EF Core. W naszych doświadczeń wynika są to najbardziej oczekiwano/przydatne zachowania dla jednostek śledzone i bazy danych.In our experience, these are the most expected/useful behaviors for tracked entities and the database. DeleteBehavior.Restrict teraz zostanie uznane dla obiektów śledzonych dla relacji opcjonalne.DeleteBehavior.Restrict is now honored for tracked entities when set for optional relationships.

Dostawca czasu projektowania pakietów usunięteProvider design-time packages removed

Microsoft.EntityFrameworkCore.Relational.Design Pakiet został usunięty.The Microsoft.EntityFrameworkCore.Relational.Design package has been removed. Jego zawartości zostały skonsolidowane w Microsoft.EntityFrameworkCore.Relational i Microsoft.EntityFrameworkCore.Design.It's contents were consolidated into Microsoft.EntityFrameworkCore.Relational and Microsoft.EntityFrameworkCore.Design.

Propaguje to do pakietów projektowania dostawcy.This propagates into the provider design-time packages. Te pakiety (Microsoft.EntityFrameworkCore.Sqlite.Design, Microsoft.EntityFrameworkCore.SqlServer.Design, itp.) zostały usunięte i ich zawartość skonsolidowane w pakiety główne dostawcy.Those packages (Microsoft.EntityFrameworkCore.Sqlite.Design, Microsoft.EntityFrameworkCore.SqlServer.Design, etc.) were removed and their contents consolidated into the main provider packages.

Aby włączyć Scaffold-DbContext lub dotnet ef dbcontext scaffold w programie EF Core 2.0 wystarczy odwołują się do jednego dostawcy pakietu: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" />