Po uaktualnieniu do ASP.NET Core 2.0 nie mogę już tworzyć migracji.
Otrzymuję
„Wystąpił błąd podczas wywoływania metody„ BuildWebHost ”w klasie„ Program ”. Kontynuacja bez dostawcy usług aplikacji. Błąd: wystąpił jeden lub więcej błędów. (Nie można otworzyć bazy danych„… ”żądanej podczas logowania. Logowanie nie powiodło się. Logowanie nie powiodło się dla użytkownika „...” "
i
„Nie można utworzyć obiektu typu„ MyContext ”. Dodaj implementację„ IDesignTimeDbContextFactory ”do projektu lub zobacz https://go.microsoft.com/fwlink/?linkid=851728, aby poznać dodatkowe wzorce obsługiwane w czasie projektowania.”
Polecenie, które uruchomiłem wcześniej, było $ dotnet ef migrations add InitialCreate --startup-project "..\Web"
(z projektu / folderu z DBContext).
Ciąg połączenia: "Server=(localdb)\\mssqllocaldb;Database=database;Trusted_Connection=True;MultipleActiveResultSets=true"
To jest mój Program.cs
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
Odpowiedzi:
Możesz dodać klasę, która implementuje IDesignTimeDbContextFactory w projekcie sieci Web.
Oto przykładowy kod:
Następnie przejdź do projektu bazy danych i uruchom następujące polecenie z wiersza polecenia:
ratunek
źródło
Nie ma potrzeby
IDesignTimeDbContextFactory
.Biegać
add-migration initial -verbose
które ujawnią szczegóły pod
ostrzeżenie, które jest główną przyczyną problemu.
W moim przypadku problem polegał na tym, że posiadanie
ApplicationRole : IdentityRole<int>
i wywoływanieservices.AddIdentity<ApplicationUser, IdentityRole>()
powodowało poniższy błądźródło
Rozwiązanie 1: (znajdź problem w 99% przypadków)
Ustaw projekt aplikacji sieci Web jako projekt startowy
Uruchom następujące polecenia z
-verbose
opcją.Rozwiązanie 2:
Zmień nazwę
BuildWebHost()
naCreateWebHostBuilder()
, ponieważEntity Framework Core tools
spodziewaj się znaleźćCreateHostBuilder
metodę, która konfiguruje hosta bez uruchamiania aplikacji..NET Core 2.2
.NET Core 3.1
Zmień nazwę
BuildWebHost()
naCreateHostBuilder()
Rozwiązanie 3:
Upewnij się, że dodano
Dbcontext
do iniekcji zależności:AddDbContext<TContext>
sprawi, że zarówno typ DbContextTContext
, jak i odpowiedni będzieDbContextOptions<TContext>
dostępny do wstrzyknięcia z kontenera usługi. Wymaga to dodania argumentu konstruktora doDbContext
typu, który akceptujeDbContextOptions<TContext>
.Przykład: w Startup.cs
Kod AppDbContext :
źródło
public static IWebHostBuilder BuildWebHost(string[] args)
napublic static IWebHost BuildWebHost(string[] args)
z.Build()
teraz zawartą w funkcjiIDesignTimeDbContextFactory
Po prostu zmień nazwę
BuildWebHost()
naCreateWebHostBuilder()
, ponieważ migracje używają tej metody domyślnie.źródło
W moim przypadku przyczyną problemu było wiele projektów startowych. W swoim rozwiązaniu mam trzy projekty: Mvc, Api i Dal. DbContext i migracje w projekcie Dal.
Skonfigurowałem wiele projektów startowych. Po kliknięciu przycisku Start działały projekty Mvc i Api. Ale w tym przypadku otrzymywałem ten błąd.
Mogłem pomyślnie dodać migrację po ustawieniu Mvc jako jedynego projektu startowego i wybraniu Dal w konsoli Menedżera pakietów.
źródło
W klasie AppContext.cs oprócz klasy AppContext dodaj kolejną klasę:
To rozwiąże twój drugi problem:
Następnie będziesz mógł dodać migrację Initial i wykonać ją, uruchamiając polecenie update-database . Jeśli jednak uruchomisz te polecenia, gdy w lokalnym SqlServer nie ma jeszcze bazy danych, zostanie wyświetlone ostrzeżenie, takie jak pierwszy błąd: „Błąd
Ale to nie jest błąd, ponieważ migracja zostanie utworzona i będzie można ją wykonać. Więc po prostu zignoruj ten błąd po raz pierwszy, a później, ponieważ Db będzie istnieć, nie powtórzy się.
źródło
sprawdź, czy masz odniesienie
źródło
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
który zawiera to odniesienie. Próbowałem również uwzględnić powyższe, ale bez zmian.Możesz wypróbować to rozwiązanie z tej dyskusji , której inspiracją był ten post .
źródło
Coś, co naprawdę mi pomogło, to ten artykuł: https://elanderson.net/2017/09/unable-to-create-an-object-of-type-applicationdbcontext-add-an-implementation-of-idesigntimedbcontextfactory/
Podstawową ideą jest to, że przy zmianie z .net core 1 na 2 cała inicjalizacja db powinna zostać przeniesiona z StartUp.cs do Program.cs. W przeciwnym razie zadania EF próbują uruchamiać inity bazy danych podczas wykonywania zadań.
„W oficjalnych dokumentach migracji ( https://docs.microsoft.com/en-us/ef/core/miscellaneous/1x-2x-upgrade ) znajduje się fajna sekcja zatytułowana„ Przenieś kod inicjalizacji bazy danych ”, która wydaje mi się przegapione. Zanim więc zaczniesz szukać króliczych nory, tak jak ja, upewnij się, że to nie jest to, co powoduje potrzebę dodania implementacji IdesignTimeDbContextFactory ”.
źródło
Z
https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation
Dodaj fabrykę w .Net Core 2.x
źródło
Miałem ten problem i rozwiązałem go Ustaw -> Aplikacja sieciowa (dołączony Program.cs) Projekt do -> „Ustaw jako projekt startowy”
Następnie uruchom -> dodaj-migrację początkową -verbose
w konsoli Menedżera pakietów
Ustaw jako projekt startowy
źródło
Jeśli chcesz uniknąć tych IDesignTimeDbContextFactory: po prostu upewnij się, że nie używasz żadnej metody Seed w swoim uruchomieniu. Podczas uruchamiania korzystałem ze statycznej metody inicjującej i powodowała ten błąd.
źródło
Wcześniej skonfigurowano dane inicjatora w metodzie Configure w pliku Startup.cs. Obecnie zaleca się używanie metody Configure tylko do konfigurowania potoku żądań. Kod startowy aplikacji należy do metody Main.
Refaktoryzowana metoda Main. Dodaj następujące odwołania do pliku Program.cs:
using Microsoft.Extensions.DependencyInjection;
using MyProject.MyDbContextFolder;
źródło
Wystąpił problem z wysyłaniem przez ef bazy danych ze Startup.Configure w wersji 2.0 ... nadal możesz to zrobić z tym obejściem. Przetestowane i działało dobrze
https://garywoodfine.com/how-to-seed-your-ef-core-database/
źródło
W moim przypadku problem wystąpił, ponieważ w moim pliku Startup.cs została wywołana metoda o nazwie SeedData.EnsurePopulated () .
Prace SeedData klasie jest dodanie początkową danych do tabeli bazy danych. Jego kod to:
ROZWIĄZANIE
Przed wykonaniem migracji po prostu zakomentuj wywołanie klasy SeedData w pliku Startup.cs.
To rozwiązało mój problem i mam nadzieję, że Twój problem również został rozwiązany w ten sam sposób.
źródło
Napotkałem ten sam problem. Mam w rozwiązaniu dwa projekty. który
Początkowo projekt API był ustawiony jako projekt startowy.
Zmieniłem projekt Startup na taki, który zawiera klasy kontekstu. Jeśli używasz programu Visual Studio , możesz ustawić projekt jako projekt startowy przez:
źródło
Przede wszystkim upewnij się, że skonfigurowałeś swoją bazę danych w
Startup.cs
W moim przypadku otrzymałem ten błąd, ponieważ nie określiłem poniżej wStartup.cs
źródło
Korzystanie z ASP.NET Core 3.1 i EntityFrameWorkCore 3.1.0. Zastępowanie OnConfiguring klasy kontekstu tylko za pomocą konstruktora bez parametrów
źródło
Miałem do czynienia z błędem
„Nie można utworzyć obiektu typu„ MyContext ”. Dodaj implementację„ IDesignTimeDbContextFactory ”do projektu lub zobacz https://go.microsoft.com/fwlink/?linkid=851728, aby poznać dodatkowe wzorce obsługiwane w czasie projektowania.”
W ten sposób został rozwiązany mój problem. Uruchom poniższe polecenie, gdy jesteś w katalogu rozwiązania
Tutaj Aplikacja jest moim projektem startowym zawierającym klasę Startup.cs, a infrastruktura to mój projekt zawierający klasę DbContext.
następnie uruchom aktualizację przy użyciu tej samej struktury.
źródło
Mam ten sam problem, odkąd odnosiłem się do starego - Microsoft.EntityFrameworkCore.Tools.DotNet
Po aktualizacji do nowszej wersji problem został rozwiązany
źródło
W pliku appsettings.json głównego projektu ustawiłem „Kopiuj do katalogu wyjściowego” na „Kopiuj zawsze” i zadziałało.
źródło
Przykładowa klasa kontekstu bazy danych dla aplikacji konsolowych .net core
źródło
Możesz również użyć w konstruktorze klasy startowej, aby dodać plik json (gdzie znajdują się parametry połączenia) do konfiguracji. Przykład:
źródło
Dla mnie to dlatego, że zmieniłem
Output Type
projekt startowy zConsole Application
naClass Library
.Wracając do załatwienia
Console Application
sprawy.źródło
Miałem ten problem w rozwiązaniu, które ma:
Otrzymuję komunikat „nie można utworzyć obiektu ...”, gdy projekt Blazor jest ustawiony jako projekt startowy, ale nie, jeśli projekt MVC jest ustawiony jako projekt startowy.
To mnie zastanawia, ponieważ w konsoli Menedżera pakietów (gdzie tworzę migrację) mam domyślny projekt ustawiony na bibliotekę klas C #, która faktycznie zawiera kontekst bazy danych, a także określam kontekst bazy danych w moje wezwanie do migracji dodatków
add-migration MigrationName -context ContextName
, więc wydaje się dziwne, że Visual Studio dba o to, jaki projekt startowy jest obecnie ustawiony.Domyślam się, że powodem jest to, że gdy projekt Blazor jest projektem startowym, PMC określa wersję .NET na Core 3.0 z projektu startowego, a następnie próbuje użyć tego do uruchomienia migracji w klasie .NET Standard 2.0 Biblioteka i uderzenie w jakiś konflikt.
Niezależnie od przyczyny, zmiana projektu startowego na projekt MVC, który jest przeznaczony dla Core 2.2, zamiast projektu Blazor, rozwiązała problem
źródło
U mnie problem polegał na tym, że uruchamiałem polecenia migracji w niewłaściwym projekcie. Uruchomienie poleceń wewnątrz projektu, który zawierał plik Startup.cs, a nie projektu zawierającego DbContext, pozwoliło mi przejść przez ten konkretny problem.
źródło
W moim przypadku pomaga ustawienie projektu StartUp w init. Możesz to zrobić, wykonując
źródło
Miałem ten sam problem. Po prostu zmieniłem ap.jason na application.jason i rozwiązano problem
źródło