Uaktualnianie aplikacji z poprzednich wersji 2.0 Core EFUpgrading applications from previous versions to EF Core 2.0

Procedury wspólne dla wszystkich aplikacjiProcedures Common to All Applications

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

  1. Uaktualnianie platformy docelowej .NET do wersji obsługującej .NET 2.0 standardowych aplikacji.Upgrading the target .NET platform of the application to one that supports .NET Standard 2.0. Zobacz obsługiwane platformy więcej szczegółów.See Supported Platforms for more details.

  2. Określ dostawcę dla docelowej bazy danych, które są zgodne z 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 EF Core (środowisko wykonawcze i narzędziami) 2.0.Upgrading all the EF Core packages (runtime and tooling) to 2.0. Zapoznaj się instalowanie Core EF więcej szczegółów.Refer to Installing EF Core for more details.

  4. Zmiany kodu niezbędne do kompensacji fundamentalne zmiany.Make any necessary code changes to compensate for breaking changes. Zobacz fundamentalne zmiany sekcji poniżej, aby uzyskać więcej informacji.See the Breaking Changes section below for more details.

Aplikacje platformy ASP.NET CoreASP.NET Core applications

  1. W szczególności zobacz nowy wzorzec do inicjowania dostawcy usług aplikacji opisane poniżej.See in particular the new pattern for initializing the application's service provider described below.

Porada

Przyjęcie ten nowy wzorzec podczas aktualizacji aplikacji 2.0 zdecydowanie zaleca się i jest wymagane dla produktu funkcji, takich jak Entity Framework Core migracji do pracy.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. Inne typowe alternatywą jest zaimplementować IDesignTimeDbContextFactory<TContext >.The other common alternative is to implement IDesignTimeDbContextFactory<TContext>.

  1. Aplikacji przeznaczonych dla platformy ASP.NET Core 2.0 służy 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 aplikacji na poprzednie wersje platformy ASP.NET Core konieczność uaktualnienia do programu ASP.NET 2.0 Core aby można było używać 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. Więcej informacji na temat uaktualniania aplikacji platformy ASP.NET Core 2.0 można znaleźć dokumentacji platformy ASP.NET Core w sprawie.For more details on upgrading ASP.NET Core applications to 2.0 see the ASP.NET Core documentation on the subject.

Fundamentalne zmianyBreaking Changes

Przekierowaliśmy możliwość znacznie uściślić naszych istniejących interfejsów API i zachowania w 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ć modyfikacji istniejącego kodu aplikacji, mimo że uważamy, że dla większości aplikacji wpływ będzie niskie, w większości przypadków wymagających tylko kompilację i minimalne zmiany z przewodnikiem, aby zamienić 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.

Nowy sposób pobierania usługi aplikacjiNew way of getting application services

Wzorzec zalecanym dla aplikacji sieci web platformy ASP.NET Core została zaktualizowana 2.0 w taki sposób, aby spowodowało przerwanie EF Core używane w 1.x logiki czasu projektowania.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, EF Core może spróbować wywołania Startup.ConfigureServices bezpośrednio w celu uzyskania dostępu do dostawcy usług aplikacji.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 2.0 Core, konfiguracja jest inicjowana poza Startup klasy.In ASP.NET Core 2.0, Configuration is initialized outside of the Startup class. Aplikacji przy użyciu EF Core zwykle dostęp do ich parametry połączenia z konfiguracji, więc Startup samodzielnie nie jest już wystarczające.Applications using EF Core typically access their connection string from Configuration, so Startup by itself is no longer sufficient. W przypadku uaktualniania aplikacji platformy ASP.NET Core 1.x następujący błąd może zostać wyświetlony podczas korzystania z narzędzi EF Core.If you upgrade an ASP.NET Core 1.x application, you may receive the following error when using the EF Core tools.

W "ApplicationContext" został znaleziony żaden konstruktor bez parametrów.No parameterless constructor was found on 'ApplicationContext'. Dodaj konstruktor bez parametrów do "ApplicationContext" albo Dodaj implementację "IDesignTimeDbContextFactory<ApplicationContext>" w tym samym zestawie co "ApplicationContext"Either add a parameterless constructor to 'ApplicationContext' or add an implementation of 'IDesignTimeDbContextFactory<ApplicationContext>' in the same assembly as 'ApplicationContext'

Nowe haku czasu projektowania został dodany w szablonie domyślnego platformy ASP.NET Core 2.0.A new design-time hook has been added in ASP.NET Core 2.0's default template. Statycznych Program.BuildWebHost metoda zapewnia podstawowe EF można uzyskać dostępu do aplikacji dostawcy usług 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 platformy ASP.NET Core 1.x, konieczne będzie informować Cię o Program klasy na podobny do następującego.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();
    }
}

Interfejsu IDbContextFactory zmienionaIDbContextFactory renamed

Aby można było obsługiwać wzorce różnych aplikacji i zapewniają użytkownikom większą kontrolę nad jak ich DbContext jest używany w czasie projektowania, udostępniamy, w przeszłości 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, EF podstawowe narzędzia odnajdzie implementacje tego interfejsu w projekcie i umożliwia utworzenie 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 nazwę, która błąd w przypadku niektórych użytkowników, aby spróbować ponownie przy użyciu 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. Zostały przechwycono poza guard, gdy narzędzia EF następnie próbowano użyć ich implementacji w czasie projektowania i spowodował poleceń, takich jak Update-Database lub dotnet ef database update się niepowodzeniem.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ę silne semantykę czasu projektowania ten interfejs, możemy zmieniono jego IDesignTimeDbContextFactory<TContext>.In order to communicate the strong design-time semantics of this interface, we have renamed it to IDesignTimeDbContextFactory<TContext>.

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, który znaleziono DbContextFactoryOptions został już potrzebne na 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 opis rozwiązań alternatywnych, który powinien być używany zamiast tego.Here are the alternatives you should be using instead.

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

Katalog roboczy czasu projektowania zmienioneDesign-time working directory changed

Zmiany platformy ASP.NET Core 2.0 wymaga również katalog roboczy używany przez dotnet ef , aby były wyrównane z katalogu roboczego używany przez 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 zauważalne efektem ubocznym tego jest tym SQLite nazwy plików są teraz względem katalogu projektu i nie do katalogu wyjściowego tak 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.

Podstawowe EF 2.0 wymaga dostawcy 2.0 bazy danychEF Core 2.0 requires a 2.0 database provider

EF Core 2.0 wprowadzono wiele uproszczenia i ulepszenia w sposób dostawcy bazy danych działa.For EF Core 2.0 we have made many simplifications and improvements in the way database providers work. Oznacza to, 1.0.x i 1.1.x dostawcy nie będą działać z 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ół EF i wersje 2.0 będą dostępne jako część programu 2.0 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. Dla dostawców innej open source SQL Compact, PostgreSQL, i MySQL są aktualizowane 2.0.The open-source third party providers for SQL Compact, PostgreSQL, and MySQL are being updated for 2.0. Dla wszystkich 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 powinny mieć wpływ większość kodu aplikacji.Note: these changes should not impact most application code.

Identyfikatory zdarzeń komunikatów wysyłanych do ILogger zostały zmienione w 2.0.The event IDs for messages sent to an ILogger have changed in 2.0. Identyfikatory zdarzeń obecnie są unikatowe w EF rdzeń kodu.The event IDs are now unique across EF Core code. Te komunikaty teraz również wykonać standardowego wzorca strukturalnych rejestrowania używany 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ć tej samej nazwy Identyfikatora zdarzenia odpowiadającego ILogger wiadomości.DiagnosticSource events now use the same event ID names as the corresponding ILogger messages. Ładunki zdarzeń są wszystkie nominalnego typów pochodnych EventData.The event payloads are all nominal types derived from EventData.

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

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

Zmiany relacyjne metadanych interfejsu API Core EFEF Core relational metadata API changes

Podstawowe EF 2.0 teraz kompilacji w innej IModel dla każdego używanego innego dostawcy.EF Core 2.0 will now build a different IModel for each different provider being used. Jest to zazwyczaj niewidoczne dla aplikacji.This is usually transparent to the application. Ma to ułatwić uproszczenia metadanych niższego poziomu interfejsów API tak, aby wszelkie dostęp do wspólne pojęcia relacyjne metadanych jest zawsze wykonywane za pośrednictwem 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 metody, takie jak ForSqlServerToTable, metody rozszerzenia są teraz dostępne do zapisu warunkowego kodu opartego na bieżącym dostawcy 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 pamiętać, że ta zmiana ma zastosowanie tylko do interfejsów API/metadanych, który jest zdefiniowany dla wszystkie relacyjne dostawców.Note that this change only applies to APIs/metadata that is defined for all relational providers. Interfejs API i metadanych jest taka sama, gdy nie jest specyficzne dla tylko jednego dostawcę.The API and metadata remains the same when it is specific to only a single provider. Na przykład indeksy klastrowane są specyficzne dla programu SQL Server, dlatego ForSqlServerIsClustered i .SqlServer().IsClustered() musi być używany.For example, clustered indexes are specific to SQL Sever, so ForSqlServerIsClustered and .SqlServer().IsClustered() must still be used.

Nie przejąć kontrolę nad dostawca programu EF usługiDon’t take control of the EF service provider

Podstawowe EF używa wewnętrznego IServiceProvider (tj. kontener iniekcji zależności) do jego wewnętrznej implementacji.EF Core uses an internal IServiceProvider (i.e. a dependency injection container) for its internal implementation. Aplikacje powinna zezwalać na podstawowe EF tworzenie i zarządzanie nimi ten dostawca, z wyjątkiem w szczególnych przypadkach.Applications should allow EF Core to create and manage this provider except in special cases. Zdecydowanie Rozważ usunięcie wszelkie wywołania UseInternalServiceProvider.Strongly consider removing any calls to UseInternalServiceProvider. Jeśli aplikacja musi wywołać UseInternalServiceProvider, należy rozważyć składanie problemu tak zbadanie 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ń istniejące połączenia do AddEntityFramework lub AddEntityFrameworkSqlServer, itd. AddDbContext nadal stosuje się 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 i zamiast tego wszystkie bazy danych w pamięci musi mieć nazwę.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 "Mojabazadanych".This creates/uses a database with the name “MyDatabase”. Jeśli UseInMemoryDatabase nie zostanie ponownie wywołany o takiej samej nazwie, a następnie można użyć tej samej bazy danych w pamięci, 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, IsReadOnlyAferSave, i IsStoreGeneratedAlways zostały zdezaktualizowane i zastąpione BeforeSaveBehavior i AfterSaveBehavior.IsReadOnlyBeforeSave, IsReadOnlyAferSave, and IsStoreGeneratedAlways have been obsoleted and replaced with BeforeSaveBehavior and AfterSaveBehavior. Te zachowania zastosowania do żadnej właściwości (nie tylko generowanych przez Magazyn właściwości) i określić jak wartość właściwości powinien być używany podczas wstawiania do wiersza bazy danych (BeforeSaveBehavior) lub gdy aktualizacja 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 oznaczone jako ValueGenerated.OnAddOrUpdate (np. dla kolumny obliczanej) domyślnie zignoruje wartości aktualnie ustawione na właściwość.Properties marked as ValueGenerated.OnAddOrUpdate (e.g. for computed columns) will by default ignore any value currently set on the property. Oznacza to, generowanych przez Magazyn wartość zawsze będzie można uzyskać niezależnie od tego, czy wartości został ustawiony lub zmodyfikowany ś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 innej Before\AfterSaveBehavior.This can be changed by setting a different Before\AfterSaveBehavior.

Nowe zachowanie delete ClientSetNullNew ClientSetNull delete behavior

W poprzednich wersjach DeleteBehavior.Restrict miał zachowania 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 nowy ClientSetNull zachowanie została wprowadzona jako domyślny dla relacji opcjonalne.In EF Core 2.0, a new ClientSetNull behavior has been introduced as the default for optional relationships. Jest to zachowanie SetNull semantyki dla śledzonych jednostek i Restrict zachowanie dla baz danych utworzonych przy użyciu EF Core.This behavior has SetNull semantics for tracked entities and Restrict behavior for databases created using EF Core. W naszym środowisku są oczekiwano/użyteczna zachowania śledzonych obiektów i bazy danych.In our experience, these are the most expected/useful behaviors for tracked entities and the database. DeleteBehavior.Restrictteraz jest honorowane dla śledzonych jednostek po ustawieniu 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 są konsolidowane w Microsoft.EntityFrameworkCore.Relational i Microsoft.EntityFrameworkCore.Design.It's contents were consolidated into Microsoft.EntityFrameworkCore.Relational and Microsoft.EntityFrameworkCore.Design.

Propaguje to do dostawcy pakietów czasu projektowania.This propagates into the provider design-time packages. Te pakiety (Microsoft.EntityFrameworkCore.Sqlite.Design, Microsoft.EntityFrameworkCore.SqlServer.Design, itd.) zostały usunięte i ich zawartość do pakietów głównego 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" />