Nie znaleziono pliku wykonywalnego zgodnego z poleceniem „dotnet-ef”

82

Robię przykład projektu przy użyciu ASP.Net Core RC2 zi Microsoft.EntityFramework.CoreSQLite.

Śledziłem ten samouczek: https://damienbod.com/2015/08/30/asp-net-5-with-sqlite-and-entity-framework-7/

Ale kiedy uruchamiam to polecenie:

dotnet ef migrations add FirstMigration

Mam ten błąd:

No executable found matching command "dotnet-ef"

Oto moja project.jsonkonfiguracja:

{
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0-rc2-3002702",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Mvc": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-final",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc2-final",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0-rc2-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc2-final",
    "Microsoft.EntityFrameworkCore": "1.0.0-rc2-final",
    "Microsoft.EntityFrameworkCore.Sqlite": "1.0.0-rc2-final"
  },

  "tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": "portable-net45+win8+dnxcore50"
    }
  },

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

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "runtimeOptions": {
    "gcServer": true
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "appsettings.json",
      "web.config"
    ]
  },

  "scripts": {
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}
Samolot
źródło
To ogłoszenie pokazuje, jak Twój project.json powinien wyglądać w RC2, jeśli używasz narzędzi: github.com/aspnet/Announcements/issues/172
Paweł

Odpowiedzi:

60

Entity Framework Core 1.0

Wystarczy zaktualizować toolssekcję pliku project.json, aby zawierała to:

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

To powinno udostępnić dotnet efpolecenia.

Ważny

Powinienem również zauważyć, że dotnet efpolecenia będą dostępne tylko wtedy, gdy zostaną uruchomione z tego samego katalogu, który zawiera plik project.json.

Entity Framework Core 1,1
Jeśli ponownie wystąpi ten problem po uaktualnieniu do Entity Framework Core 1,1, pamiętaj, aby zastąpić Microsoft.EntityFrameworkCore.Toolszależność Microsoft.EntityFrameworkCore.Tools.DotNetwersją 1.1.0-preview4. Nie ma też potrzeby zachowywania importssekcji. Aby uzyskać więcej informacji na ten temat, zobacz nagłówek „Uaktualnianie do wersji 1.1” w poście na blogu z zapowiedzią wydania Entity Framework Core 1.1 .

Daniel Grim
źródło
Dziękuję bardzo: D
Redplane
22
project.jsonMój problem to nie bycie w folderze z , dzięki!
kitsu.eb
6
Nie działa mi. Ciągle otrzymuję ten sam błąd.
Nikola Schou
1
@NikolaSchou Musisz także ponownie otworzyć cmd.
Tyler
1
@Adrian, też dziękuję. Po dłuższym czasie wracam do .net core. Kiedy zadałem to pytanie, stanąłem przed starym problemem. Tak zabawne
Redplane
56

Entity Framework Core 1.1.0

Dodając do tego, jeśli używasz VS2017 z nowymi projektami .csproj bez pliku project.json

musisz edytować plik .csproj (kliknij go prawym przyciskiem myszy w eksploratorze rozwiązań i kliknij edytuj cokolwiek.csproj), a następnie wklej to w

<ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet">
      <Version>1.0.0-*</Version>
    </DotNetCliToolReference>
  </ItemGroup>

dzięki uprzejmości: https://github.com/aspnet/EntityFramework/issues/7358#issuecomment-278379967

mwoa
źródło
działa, ale musisz znać poprawną wersję. Ponieważ jestem nowy, bardzo trudno było mi znaleźć właściwą wersję. Więc każdy, kto podąża za odpowiedzią, zna Twoją wersję Microsoft.EntityFrameworkCore.Tools.DotNet i wstawia znacznik wersji. tj. <Version> 2.0.3 </Version>
Saleh Enam Shohag,
To naprawdę ratuje mój dzień. Dzięki! Zaktualizowałem VS2017i automatycznie zaktualizowałem dotnet core CLIdo 2.0wersji, która nie jest kompatybilna z dotnet core 1.0. Ale wydaje się, że jest to czas, który powinien zaktualizować projekt .net core 1.0do 2.0.
Boooooooooms
40

Specyficzne dla VS2017 15.3 lub nowszego i ASP.NET CORE 2.0 lub nowszego ...

Zainstaluj nuget dla dostawcy db za pomocą wiersza polecenia lub menedżera pakietów NuGet.

dotnet add package Microsoft.EntityFrameworkCore.SqlServer

Dodaj następującą sekcję do .csproj

<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" 
    Version="2.0.0" />
</ItemGroup>

Zainstaluj narzędzia czasu projektowania za pomocą wiersza polecenia lub menedżera NuGet w VS2017.

dotnet add package Microsoft.EntityFrameworkCore.Design

Umożliwia to dotnet ef * w wierszu polecenia w katalogu projektu.

Włącza polecenia dotnet ef * w wierszu poleceń w katalogu projektu,

dotnet ef migrations add Initial
dotnet ef database update Initial
dotnet ef dbcontext scaffold 
Joe Healy
źródło
2
Świetna odpowiedź, szukałem wszystkiego, a sekcja dotycząca dodawania do „ItemGroup” była tym, co naprawdę blokowało mnie na .NET Core 2 Web API przy użyciu EF Core 2.
djangojazz
To samo tutaj. W DotNetCliToolReference moim przypadku kluczem był plik z Tools.DotNet
blfuentes
To rozwiązało mój problem, ten sam problem z NET Core 2 Web API przy użyciu EF Core 2
Deluq
32

Jest to częsty problem podczas przełączania z .NET Core 1.0 na .NET Core 1.1+ lub 2.x.

Aby to naprawić, musisz:

  • Pobierz biblioteki pakietów Microsoft.EntityFrameworkCore.Tools i Microsoft.EntityFrameworkCore.Tools.DotNet przy użyciu NuGet.
  • Ręcznie dodaj odwołanie do tego pakietu w pliku konfiguracyjnym projektu project.json(dla programu .NET Core 1.0) lub <projectName>.csproj(dla programu .NET Core 1.1+ i 2.x).

Dokładniej, w przypadku projektów .NET Core 1.0 dodaj to:

"tools": {
   "Microsoft.EntityFrameworkCore.Tools": "1.0.0"
   "Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0"
 }

W przypadku projektów .NET Core 1.1+ i .NET Core 2.x dodaj to:

<ItemGroup>
  <DotNetCliToolReference 
      Include="Microsoft.EntityFrameworkCore.Tools" 
      Version="2.0.0" />
  <DotNetCliToolReference 
      Include="Microsoft.EntityFrameworkCore.Tools.DotNet" 
      Version="2.0.0" />
</ItemGroup>

Jeśli masz już toolsklucz json lub <ItemGroup>element z co najmniej jednym istniejącym DotNetCliToolReferenceelementem, po prostu dodaj nowe do istniejącej grupy.

WAŻNE : poza wykonaniem powyższych kroków, musisz uruchomić dotnet efpolecenie w folderze głównym projektu (tym zawierającym plik projektu), w przeciwnym razie nie zadziała.

Więcej informacji i obszerne wyjaśnienie problemu można przeczytać na moim blogu .

Darkseal
źródło
Dzięki kolego,
ratujesz
Jak uruchomić polecenie dotnet ef w folderze głównym projektu?
Ian Warburton
1
@IanWarburton, mając C:\Program Files\dotnetw zmiennej środowiskowej PATH LUB używając pełnej ścieżki, tj. C:\Program Files\dotnet\dotnet.exe
Darkseal
Pracował dla mnie w .NET Core 2.0. Przyjęte rozwiązanie nie zadziałało dla mnie. WAŻNA sekcja załatwiła mi sprawę. Dzięki.
mpatel
18

Myślę, że znalazłem dokładne rozwiązanie problemu - dotnet: nie znaleziono pliku wykonywalnego zgodnego z poleceniem „dotnet-ef” ..

Używam dot net core 2.0 w VS 2017 w wersji 15.5.3

Przyczyna tego błędu

Ten błąd jest spowodowany ponieważ Nuget to nie mógł znaleźć się plik rozwiązania na miejscu.

Rozwiązanie: - Przejdź do katalogu, w którym znajduje się klasa „Startup.cs”

  1. Przeniosłem się do katalogu głównego , dodając poniższe polecenie w konsoli Menedżera pakietów .

    cd. \ Szkoła1

Tutaj „School1” był moim głównym katalogiem projektu i zawiera moją klasę „Startup.cs”, w twoim przypadku będzie inaczej.

  1. Następnie uruchom polecenie dotnet efw konsoli Menedżera pakietów, która będzie teraz działać pomyślnie.

Przykład ze zdjęciami dla jasnego zrozumienia

  1. Wystąpił błąd Błąd podczas uruchamiania dotnet ef. wprowadź opis obrazu tutaj

  2. Poprawiłem błąd, przechodząc do folderu głównego za pomocą polecenia cd .\School1

Mam nadzieję, że pomoże to moim innym programistom Dot Net.

wprowadź opis obrazu tutaj

yogihosting
źródło
1
tak, pomogło mi to rozwiązać podobny problem, z którym miałem do czynienia. dzięki.
mns
1
w pewnym stopniu mi to pomaga. Aby rozwiązać problem, podążam również za odpowiedzią @Michael Freidgeim
Saleh Enam Shohag
12

Musiałem dodać Microsoft.EntityFrameworkCore.Tools. DotNet do pracy. Sekcja narzędzi w pliku project.json będzie wyglądać następująco:

"tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.1.0-preview4-final",
    "Microsoft.AspNetCore.Razor.Tools": "1.1.0-preview4-final",
    "Microsoft.EntityFrameworkCore.Tools":"1.1.0-preview4-final",
    "Microsoft.EntityFrameworkCore.Tools.DotNet": "1.1.0-preview4-final"
},
Alexandre Swioklo
źródło
Nie ma „Microsoft.EntityFrameworkCore.Tools.DotNet”
Elvin Mammadov
2
W interfejsie GUI przeglądania zarządzania pakietami NuGet znajduje się wyszukiwany termin .Tools.DotNet. Najnowsza wersja wstępna to 1.1.0-preview4-final.
K7Buoy
4

Jeśli napotkasz ten problem i uruchomisz rdzeń asp.net za pomocą narzędzia CLI, możesz go rozwiązać, dodając <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" /> do pliku xx.csproj i dotnet restore . Następnie możesz użyć polecenia dotnet ef.

Delfin
źródło
Właściwie natknąłem się na ten sam problem. Używałem 2.0.2 Microsoft.EntityFrameworkCore.Tools.DotNet i zaktualizowałem plik proj, ponownie załadowałem projekt, a następnie ponownie przetestowałem i zadziałało. Dzięki!
Miles
1

Zamiast otwierać osobne okno konsoli w programie VS Package Manager Console wpisz i uruchom następujące polecenia:

Dodaj migrację

Add-Migration <migration name>

Usuń ostatnią migrację

Remove-Migration

Przed zastosowaniem migracji (lub w celu zastosowania migracji):

Update-Database

Po zastosowaniu migracji:

Update-Database -Migration <previous migration> -Context <db context name>

HTH

EDYCJA : Możesz również potrzebować następującej klasy w swoim głównym projekcie MVC:

public class DbContextFactory : IDesignTimeDbContextFactory<NotesContext>
{
    public YourDbContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<YourDbContext>();
        builder.UseSqlServer("DefaultConnection", optionsBuilder => optionsBuilder.MigrationsAssembly(typeof(YourDbContext).GetTypeInfo().Assembly.GetName().Name));
        return new YourDbContext(builder.Options);
    }
}
Aleksandra Christowa
źródło
1

W moim przypadku dotnet efnie było dostępne i nie wyświetlało się na liście kiedydotnet -h jest uruchomiony.

Zainstalowałem globalnie dotnet-ef za pomocą następującego polecenia i teraz mogę go używać. Ale nadal nie ma na liście.

dotnet tool install -g dotnet-ef 
HasanG
źródło
0

Używałem osobnego projektu biblioteki klas. Po wypróbowaniu i niepowodzeniu wszystkich powyższych czynności w konsoli menedżera pakietów. Użyłem wiersza poleceń i zadziałało! Dziwne. Jednak zasługa tego artykułu . A jeśli używasz oddzielnego projektu biblioteki klas, to jest twoje rozwiązanie.

Mohsin
źródło
0

W programie Visual Studio 2017 musiałem uruchomić te polecenia z konsoli menedżera pakietów

install-package Microsoft.EntityFrameworkCore.SqlServer.Design

Scaffold-DbContext "Server=.\sqlexpress;Database=MyDb;Trusted_Connection=True;MultipleActiveResultSets=true" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Model -Context "MyApp"
Kyriacos
źródło
0

W sekcji narzędzi dodaj poniższy kod,

 "tools": {

    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
    "Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0-preview2-final",

    "Microsoft.AspNetCore.Server.IISIntegration.Tools": {

      "version": "1.0.0-preview2-final",
      "imports": "portable-net45+win8+dnxcore50"
    }
  }

Ten format kodu rozwiązał mój błąd.

T-Jayanth Dore
źródło
0

Domyślnie podczas dodawania pakietu NuGet zostanie dodany jako PackageReference, jest to nieprawidłowe, więc edytuj go ręcznie

1- Edytuj plik .csproj

2- zmiana z „PackageReference”:

<ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.1"/>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3"/>
</ItemGroup>
to:
<ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.1"/>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3"/>
</ItemGroup>
Luis
źródło