Uaktualnianie z programu EF Core 1.0 RC1 do wersji 1.0 RC2Upgrading from EF Core 1.0 RC1 to 1.0 RC2

Ten artykuł zawiera wskazówki dotyczące przenoszenia aplikacji skompilowanej za pomocą pakietów RC1 do RC2.This article provides guidance for moving an application built with the RC1 packages to RC2.

Nazwy pakietów i wersjePackage Names and Versions

Między RC1 i RC2 firma Microsoft zmieniony z "Entity Framework 7" na "Entity Framework Core".Between RC1 and RC2, we changed from "Entity Framework 7" to "Entity Framework Core". Możesz dowiedzieć się więcej o ze względu na zmianę w ten wpis, Scott hanselman.You can read more about the reasons for the change in this post by Scott Hanselman. Ze względu na tę zmianę nazw naszych pakietów zmieniła się z EntityFramework.* do Microsoft.EntityFrameworkCore.* i nasze w wersjach od 7.0.0-rc1-final do 1.0.0-rc2-final (lub 1.0.0-preview1-final narzędzi).Because of this change, our package names changed from EntityFramework.* to Microsoft.EntityFrameworkCore.* and our versions from 7.0.0-rc1-final to 1.0.0-rc2-final (or 1.0.0-preview1-final for tooling).

Konieczne będzie całkowicie usunąć pakiety RC1, a następnie zainstaluj RC2 te.You will need to completely remove the RC1 packages and then install the RC2 ones. Poniżej przedstawiono mapowanie niektóre popularne pakiety innych.Here is the mapping for some common packages.

Pakiet RC1RC1 Package Odpowiednik RC2RC2 Equivalent
EntityFramework.MicrosoftSqlServer 7.0.0-rc1-finalEntityFramework.MicrosoftSqlServer 7.0.0-rc1-final Microsoft.EntityFrameworkCore.SqlServer 1.0.0-rc2-finalMicrosoft.EntityFrameworkCore.SqlServer 1.0.0-rc2-final
EntityFramework.SQLite 7.0.0-rc1-finalEntityFramework.SQLite 7.0.0-rc1-final Microsoft.EntityFrameworkCore.Sqlite 1.0.0-rc2-finalMicrosoft.EntityFrameworkCore.Sqlite 1.0.0-rc2-final
EntityFramework7.Npgsql 3.1.0-rc1-3EntityFramework7.Npgsql 3.1.0-rc1-3 NpgSql.EntityFrameworkCore.Postgres NpgSql.EntityFrameworkCore.Postgres
EntityFramework.SqlServerCompact35 7.0.0-rc1-finalEntityFramework.SqlServerCompact35 7.0.0-rc1-final EntityFrameworkCore.SqlServerCompact35 1.0.0-rc2-finalEntityFrameworkCore.SqlServerCompact35 1.0.0-rc2-final
EntityFramework.SqlServerCompact40 7.0.0-rc1-finalEntityFramework.SqlServerCompact40 7.0.0-rc1-final EntityFrameworkCore.SqlServerCompact40 1.0.0-rc2-finalEntityFrameworkCore.SqlServerCompact40 1.0.0-rc2-final
EntityFramework.InMemory 7.0.0-rc1-finalEntityFramework.InMemory 7.0.0-rc1-final Microsoft.EntityFrameworkCore.InMemory 1.0.0-rc2-finalMicrosoft.EntityFrameworkCore.InMemory 1.0.0-rc2-final
EntityFramework.IBMDataServer 7.0.0-beta1EntityFramework.IBMDataServer 7.0.0-beta1 Nie jest jeszcze dostępna RC2Not yet available for RC2
EntityFramework.Commands 7.0.0-rc1-finalEntityFramework.Commands 7.0.0-rc1-final Microsoft.EntityFrameworkCore.Tools 1.0.0-preview1-finalMicrosoft.EntityFrameworkCore.Tools 1.0.0-preview1-final
EntityFramework.MicrosoftSqlServer.Design 7.0.0-rc1-finalEntityFramework.MicrosoftSqlServer.Design 7.0.0-rc1-final Microsoft.EntityFrameworkCore.SqlServer.Design 1.0.0-rc2-finalMicrosoft.EntityFrameworkCore.SqlServer.Design 1.0.0-rc2-final

NamespacesNamespaces

Wraz z nazwy pakietu, przestrzenie nazw zmieniła się z Microsoft.Data.Entity.* do Microsoft.EntityFrameworkCore.*.Along with package names, namespaces changed from Microsoft.Data.Entity.* to Microsoft.EntityFrameworkCore.*. Może obsłużyć tej zmiany z Znajdź/Zamień z using Microsoft.Data.Entity z using Microsoft.EntityFrameworkCore.You can handle this change with a find/replace of using Microsoft.Data.Entity with using Microsoft.EntityFrameworkCore.

Tabela zmian konwencji nazewnictwaTable Naming Convention Changes

Znaczące zmiany funkcjonalne w wersji RC2, Skorzystaliśmy było użyć nazwy DbSet<TEntity> właściwości dla danej jednostki, jako nazwę tabeli mapowania, a nie tylko nazwę klasy.A significant functional change we took in RC2 was to use the name of the DbSet<TEntity> property for a given entity as the table name it maps to, rather than just the class name. Możesz dowiedzieć się więcej o tej zmianie w problem powiązane ogłoszenie.You can read more about this change in the related announcement issue.

W przypadku istniejących aplikacji RC1, firma Microsoft zaleca, dodając następujący kod na początku swoje OnModelCreating metodę, aby zachować strategia nazewnictwa RC1:For existing RC1 applications, we recommend adding the following code to the start of your OnModelCreating method to keep the RC1 naming strategy:

foreach (var entity in modelBuilder.Model.GetEntityTypes())
{
    entity.Relational().TableName = entity.DisplayName();
}

Jeśli chcesz, który wdrożył nowy strategia nazewnictwa, czy zalecane jest pomyślnie Kończenie pozostałe kroki uaktualnienia, a następnie usunięcie kodu i tworzenia migracji do zastosowania w tabeli zmienia nazwę.If you want to adopt the new naming strategy, we would recommend successfully completing the rest of the upgrade steps and then removing the code and creating a migration to apply the table renames.

AddDbContext / Startup.cs zmian (tylko w przypadku projektów ASP.NET Core)AddDbContext / Startup.cs Changes (ASP.NET Core Projects Only)

W wersji RC1, trzeba było dodać usługi Entity Framework do dostawcy usług w aplikacji — w Startup.ConfigureServices(...):In RC1, you had to add Entity Framework services to the application service provider - in Startup.ConfigureServices(...):

services.AddEntityFramework()
  .AddSqlServer()
  .AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));

W wersji RC2, możesz usunąć wywołania AddEntityFramework(), AddSqlServer()itp.:In RC2, you can remove the calls to AddEntityFramework(), AddSqlServer(), etc.:

services.AddDbContext<ApplicationDbContext>(options =>
  options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));

Musisz również dodać Konstruktor pochodnej kontekst, który przyjmuje opcje kontekstu i przekazuje je do konstruktora podstawowego.You also need to add a constructor, to your derived context, that takes context options and passes them to the base constructor. Jest to niezbędne, ponieważ firma Microsoft usunęła niektóre scary magic, który snuck je w tle:This is needed because we removed some of the scary magic that snuck them in behind the scenes:

public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
    : base(options)
{
}

Przekazywanie w IServiceProvider.Passing in an IServiceProvider

Jeśli masz kod RC1, który przekazuje IServiceProvider kontekst, to teraz przeniesiono do DbContextOptions, a nie parametrem oddzielne konstruktora.If you have RC1 code that passes an IServiceProvider to the context, this has now moved to DbContextOptions, rather than being a separate constructor parameter. Użyj DbContextOptionsBuilder.UseInternalServiceProvider(...) można ustawić dostawcę usług.Use DbContextOptionsBuilder.UseInternalServiceProvider(...) to set the service provider.

TestowanieTesting

Najbardziej typowym scenariuszem tego zrobić był umożliwiają kontrolowanie zakresu InMemory bazy danych, podczas testowania.The most common scenario for doing this was to control the scope of an InMemory database when testing. Zobacz zaktualizowanego testowania artykułu, na przykład w ten sposób za pomocą RC2.See the updated Testing article for an example of doing this with RC2.

Rozpoznawanie wewnętrznych usług od dostawcy usług w aplikacji (tylko w przypadku projektów ASP.NET Core)Resolving Internal Services from Application Service Provider (ASP.NET Core Projects Only)

Aplikacja ASP.NET Core, i chcesz EF, aby rozwiązać wewnętrznych usług od dostawcy usług w aplikacji, czy przeciążenia AddDbContext pozwala skonfigurować to:If you have an ASP.NET Core application and you want EF to resolve internal services from the application service provider, there is an overload of AddDbContext that allows you to configure this:

services.AddEntityFrameworkSqlServer()
  .AddDbContext<ApplicationDbContext>((serviceProvider, options) =>
    options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"])
           .UseInternalServiceProvider(serviceProvider)); );

Ostrzeżenie

Firma Microsoft zaleca, dzięki czemu EF wewnętrznie Zarządzanie własnych usług, chyba że masz powód, aby połączyć wewnętrznych usług EF w aplikacji dostawcy usługi.We recommend allowing EF to internally manage its own services, unless you have a reason to combine the internal EF services into your application service provider. Głównym powodem, czy chcesz to zrobić jest Zastąp usług, które jest używane wewnętrznie EF za pomocą dostawcy usługi aplikacjiThe main reason you may want to do this is to use your application service provider to replace services that EF uses internally

Poleceń środowiska DNX = > .NET interfejsu wiersza polecenia (tylko w przypadku projektów ASP.NET Core)DNX Commands => .NET CLI (ASP.NET Core Projects Only)

Jeśli wcześniej używano dnx ef poleceń dla projektów ASP.NET 5, te zostały przeniesione do dotnet ef poleceń.If you previously used the dnx ef commands for ASP.NET 5 projects, these have now moved to dotnet ef commands. Tej samej składni polecenia nadal obowiązuje ograniczenie.The same command syntax still applies. Możesz użyć dotnet ef --help Aby uzyskać informacje o składni.You can use dotnet ef --help for syntax information.

Sposób, w jaki są rejestrowane polecenia został zmieniony w wersji RC2 z powodu środowiska DNX, jest zastępowany przez interfejs wiersza polecenia platformy .NET.The way commands are registered has changed in RC2, due to DNX being replaced by .NET CLI. Polecenia są teraz zarejestrowane w usłudze tools sekcji project.json:Commands are now registered in a tools section in project.json:

"tools": {
  "Microsoft.EntityFrameworkCore.Tools": {
    "version": "1.0.0-preview1-final",
    "imports": [
      "portable-net45+win8+dnxcore50",
      "portable-net45+win8"
    ]
  }
}

Porada

Jeśli używasz programu Visual Studio, możesz teraz używać Konsola Menedżera pakietów do uruchamiania poleceń EF dla projektów ASP.NET Core (to zostało nie obsługiwane w wersji RC1).If you use Visual Studio, you can now use Package Manager Console to run EF commands for ASP.NET Core projects (this was not supported in RC1). Nadal trzeba zarejestrować poleceń w tools części project.json w tym celu.You still need to register the commands in the tools section of project.json to do this.

Menedżer pakietów polecenia wymagają programu PowerShell 5Package Manager Commands Require PowerShell 5

Jeśli używasz poleceń programu Entity Framework w konsoli Menedżera pakietów w programie Visual Studio, następnie należy upewnić się, że masz zainstalowanego 5 programu PowerShell.If you use the Entity Framework commands in Package Manager Console in Visual Studio, then you will need to ensure you have PowerShell 5 installed. Jest to wymagane tymczasowe, która zostanie usunięta w następnej wersji (zobacz wystawiać #5327 Aby uzyskać więcej informacji).This is a temporary requirement that will be removed in the next release (see issue #5327 for more details).

Za pomocą "import" w pliku project.jsonUsing "imports" in project.json

Niektóre z programem EF Core zależności nie obsługują .NET Standard jeszcze.Some of EF Core's dependencies do not support .NET Standard yet. EF Core w projektach .NET Standard i .NET Core może wymagać, dodając "imports" do pliku project.json jako rozwiązanie tymczasowe.EF Core in .NET Standard and .NET Core projects may require adding "imports" to project.json as a temporary workaround.

Podczas dodawania EF, przywracanie pakietów NuGet spowoduje wyświetlenie tego komunikatu o błędzie:When adding EF, NuGet restore will display this error message:

Package Ix-Async 1.2.5 is not compatible with netcoreapp1.0 (.NETCoreApp,Version=v1.0). Package Ix-Async 1.2.5 supports:
  - net40 (.NETFramework,Version=v4.0)
  - net45 (.NETFramework,Version=v4.5)
  - portable-net45+win8+wp8 (.NETPortable,Version=v0.0,Profile=Profile78)
Package Remotion.Linq 2.0.2 is not compatible with netcoreapp1.0 (.NETCoreApp,Version=v1.0). Package Remotion.Linq 2.0.2 supports:
  - net35 (.NETFramework,Version=v3.5)
  - net40 (.NETFramework,Version=v4.0)
  - net45 (.NETFramework,Version=v4.5)
  - portable-net45+win8+wp8+wpa81 (.NETPortable,Version=v0.0,Profile=Profile259)

Obejście polega na ręcznie zaimportować przenośnej profilu "portable net451 + win8".The workaround is to manually import the portable profile "portable-net451+win8". Tego pakietu NuGet, aby traktować to pliki binarne, które odpowiadają tym wymusza działają jako środowisko zgodne z technologią .NET Standard, nawet jeśli nie są one.This forces NuGet to treat this binaries that match this provide as a compatible framework with .NET Standard, even though they are not. Mimo że "portable net451 + win8" nie jest zgodny z .NET Standard w 100%, są one zgodne, przejścia od PCL .NET Standard.Although "portable-net451+win8" is not 100% compatible with .NET Standard, it is compatible enough for the transition from PCL to .NET Standard. Importy można usunąć zależności EF firmy po pewnym czasie uaktualnić do wersji .NET Standard.Imports can be removed when EF's dependencies eventually upgrade to .NET Standard.

Do "import" można dodać wielu platform przy użyciu składni tablicy.Multiple frameworks can be added to "imports" in array syntax. Pozostałe Importy może być konieczne, jeśli dodatkowe biblioteki zostaną dodane do projektu.Other imports may be necessary if you add additional libraries to your project.

{
  "frameworks": {
    "netcoreapp1.0": {
      "imports": ["dnxcore50", "portable-net451+win8"]
    }
  }
}

Zobacz wystawiać #5176.See Issue #5176.