Nie można utworzyć migracji po uaktualnieniu do ASP.NET Core 2.0

109

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();
}
ruhm
źródło
3
Prawdopodobnie problem nie występuje w Program.cs. Prawdopodobnie jest to użycie instrukcji do załadowania danych początkowych na końcu metody Configure: DbInitializer.Initialize (kontekst); Jeśli masz tę instrukcję, skomentuj ją: //DbInitializer.Initialize(context); Następnie uruchom instrukcje migracji, aby przetestować. Jeśli pojawi się problem, kontynuuj działanie klasy DbInitializer.cs.
Miguel Torres C
1
Czy Twoja klasa MyContext znajduje się w innym projekcie biblioteki klas?
Orhun
Ten sam problem, kontekst jest w innej bibliotece. Jeśli id ​​dodaje parametr less consturctor do kontekstu, migracje działają, ale z tym samym błędem: (Wystąpił błąd podczas wywoływania metody „BuildWebHost” w klasie „Program”. Kontynuacja bez dostawcy usług aplikacji. Błąd: Nie ustawiono odwołania do obiektu do instancji obiektu.)
iBoonZ
Czy udało Ci się to w końcu rozwiązać?
Konrad Viltersten,
@MiguelTorresC dzięki za ten komentarz. Skomentowałem, że moje metody wysiewu i migracje znów zaczęły działać. Wielkie dzięki !!!
Amit Philips,

Odpowiedzi:

123

Możesz dodać klasę, która implementuje IDesignTimeDbContextFactory w projekcie sieci Web.

Oto przykładowy kod:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<CodingBlastDbContext>
{
    public CodingBlastDbContext CreateDbContext(string[] args)
    {
        IConfigurationRoot configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .Build();
        var builder = new DbContextOptionsBuilder<CodingBlastDbContext>();
        var connectionString = configuration.GetConnectionString("DefaultConnection");
        builder.UseSqlServer(connectionString);
        return new CodingBlastDbContext(builder.Options);
    }
}

Następnie przejdź do projektu bazy danych i uruchom następujące polecenie z wiersza polecenia:

dotnet ef migrations add InitialMigration -s ../Web/

dotnet ef database update -s ../Web/

-s stands for startup project and ../Web/ is the location of my web/startup project.

ratunek

jaaso
źródło
2
Otrzymuję: Nie znaleziono pliku konfiguracyjnego „appsettings.json” i nie jest on opcjonalny. Ścieżka fizyczna to „C: \ Users \ XXX \ Documents \ Visual Studio 2017 \ Projects \ XXX \ src \ XXX.Api \ bin \ Debug \ netcoreapp2.0 \ appsettings.json”. Moje ustawienia aplikacji znajdują się w C: \ Users \ XXX \ Documents \ Visual Studio 2017 \ Projects \ XXX \ src \ XXX.Api.
Reft
Upewnij się, że plik appsettings.json jest ustawiony na kopiowanie lokalne, co powinno rozwiązać problem z nie znalezieniem go
DaImTo,
1
To rozwiązanie wprowadza zależność od Entity Framework do aplikacji hosta (w moim przypadku jest to projekt sieci Web). Czy jest jakiś sposób, aby to obejść? Chciałbym, aby moja biblioteka repozytorium zawierała elementy EF i nie wprowadzała EF do aplikacji internetowej.
Banoona,
Mimo że jest to akceptowana odpowiedź, ta jest lepsza: stackoverflow.com/a/52671330/1737395 Rzeczywiście, uruchomienie migracji z flagą --verbose bardzo pomaga
barbara.post
73

Nie ma potrzeby IDesignTimeDbContextFactory.

Biegać

add-migration initial -verbose

które ujawnią szczegóły pod

Wystąpił błąd podczas uzyskiwania dostępu do IWebHost w klasie „Program”. Kontynuacja bez dostawcy usług aplikacji.

ostrzeżenie, które jest główną przyczyną problemu.

W moim przypadku problem polegał na tym, że posiadanie ApplicationRole : IdentityRole<int>i wywoływanie services.AddIdentity<ApplicationUser, IdentityRole>()powodowało poniższy błąd

System.ArgumentException: GenericArguments[1], 'Microsoft.AspNetCore.Identity.IdentityRole', 
on 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`9[TUser,TRole,TContext,
TKey,TUserClaim,TUserRole,TUserLogin,TUserToken,TRoleClaim]' violates the constraint of type 'TRole'.
---> System.TypeLoadException: GenericArguments[1], 'Microsoft.AspNetCore.Identity.IdentityRole', 
on 'Microsoft.AspNetCore.Identity.UserStoreBase`8[TUser,TRole,TKey,TUserClaim,
TUserRole,TUserLogin,TUserToken,TRoleClaim]' violates the constraint of type parameter 'TRole'.
tchelidze
źródło
3
Tak - Verbose pomaga rzeczywiście odkryć prawdziwy problem. W moim przypadku nie dodałem usług AddDbContext do uruchomienia.
sudhakarssd
3
dotnet ef migrations add InitialCreate --verbose
barbara.post
4
@tchelidze Dziękuję za to, w moim przypadku nie miałem konstruktora bez parametrów w moim ApplicationDbContext.
Tiago Ávila
1
To fantastyczna wskazówka, powinna być akceptowaną odpowiedzią
Avrohom Yisroel
1
Dziękuję bardzo, pomogło mi to znaleźć mój problem i go rozwiązać. W moim przypadku był to „Nie zdefiniowano konstruktora bez parametrów dla typu„ Data.Access.DAL.MainDbContext ”.”, Dlatego właśnie usunąłem parametry z konstruktora i zadziałało to jak magia!
Sarah
25

Rozwiązanie 1: (znajdź problem w 99% przypadków)

Ustaw projekt aplikacji sieci Web jako projekt startowy

Uruchom następujące polecenia z -verboseopcją.

Add-Migration Init -Verbose

-verbose Opcja pomaga faktycznie odkryć prawdziwy problem, zawiera szczegółowe błędy.

Rozwiązanie 2:

Zmień nazwę BuildWebHost()na CreateWebHostBuilder(), ponieważ Entity Framework Core toolsspodziewaj się znaleźć CreateHostBuildermetodę, która konfiguruje hosta bez uruchamiania aplikacji.

.NET Core 2.2

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
} 

.NET Core 3.1

Zmień nazwę BuildWebHost()naCreateHostBuilder()

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Rozwiązanie 3:

Upewnij się, że dodano Dbcontextdo iniekcji zależności: AddDbContext<TContext>sprawi, że zarówno typ DbContext TContext, jak i odpowiedni będzie DbContextOptions<TContext>dostępny do wstrzyknięcia z kontenera usługi. Wymaga to dodania argumentu konstruktora do DbContexttypu, który akceptuje DbContextOptions<TContext>.

Przykład: w Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<AppDbContext>(options => options.UseSqlServer(connectionString));
}

Kod AppDbContext :

public class AppDbContext: DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options)
      :base(options)
    { }

}
Ali Bayat
źródło
1
To zadziałało dla mnie. Zmieniono funkcję BuildWebHost w Program.cs z public static IWebHostBuilder BuildWebHost(string[] args)na public static IWebHost BuildWebHost(string[] args)z .Build()teraz zawartą w funkcji
zola25
1
Chłopaki, jeśli używasz ASP.NET Core 2.1+, metoda BuildWebHost będzie miała inną nazwę - CreateWebHostBuilder z powodu docs.microsoft.com/en-us/aspnet/core/migration/ ... więc zmień nazwę CreateWebHostBuilder na BuildWebHost, a migracja znajdzie BuildWebHost i pobierz z niego DbContext.
KEMBL
2
Dzięki kolego, rozwiązany po spędzeniu 2 godzin na konfigurowaniu bez używaniaIDesignTimeDbContextFactory
Azri Zakaria
3
Dzięki za flagę „-Verbose”. Pomogło mi to znaleźć podstawową przyczynę wyjątku.
Sergey_T
21
public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
    }
}

Po prostu zmień nazwę BuildWebHost()na CreateWebHostBuilder(), ponieważ migracje używają tej metody domyślnie.

Sherox
źródło
4
CO. To powinno być reklamowane na każdej stronie zajmujących się tym zagadnieniem Poważnie . Natychmiastowy sukces. Dziękuję Ci.
Chaim Eliyah
Uratuj mój dzień !!! To bardzo dziwny błąd. Używam .net core 3.0 z wersją zapoznawczą 7 i ten błąd nadal istnieje
D Todorov
@DTodorov przeczytaj ten devblogs.microsoft.com/dotnet/ ...
sherox
D Todorov Po prostu zmień nazwę BuildWebHost () na CreateHostBuilder ()
Ali Bayat
1
@WernerCD Cuz Worker używa metody CreateHostBuilder (), która implementuje IHostBuilder z Net Core 3
sherox
11

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.

„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.”

Mogłem pomyślnie dodać migrację po ustawieniu Mvc jako jedynego projektu startowego i wybraniu Dal w konsoli Menedżera pakietów.

Gürol Mehmet Çetin
źródło
1
Dziękuję, mnie spotkało to samo. Musiałem zmienić projekt startowy na miejsce, w którym istnieją klasy Startup / Program. Komunikat o błędzie to kiepski żart.
Ľuboš Čurgó
1
Komunikaty wyjściowe były naprawdę frustrujące. Nieoczekiwanie nie wybrałem żadnego projektu startowego. To był powód, dla którego nie można było utworzyć dbContext. Dzięki.
upkit
1
Dziękuję panu ... Oszczędzam dużo czasu
Naveed Khan
7

W klasie AppContext.cs oprócz klasy AppContext dodaj kolejną klasę:

// required when local database deleted
public class ToDoContextFactory : IDesignTimeDbContextFactory<AppContext>
{
    public AppContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<AppContext>();
          builder.UseSqlServer("Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true");
        return new AppContext(builder.Options);
    }
}

To rozwiąże twój drugi problem:

„Nie można utworzyć obiektu typu„ MyContext ”. Dodaj implementację„ IDesignTimeDbContextFactory ”do projektu,

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

wystąpiło podczas wywoływania metody „BuildWebHost” w klasie „Program” ... Logowanie nie powiodło się. Logowanie nie powiodło się dla użytkownika „...” "

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ę.

borisdj
źródło
4

sprawdź, czy masz odniesienie

<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />
Vladmir
źródło
5
Używam, <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.
ruhm
4

Możesz wypróbować to rozwiązanie z tej dyskusji , której inspiracją był ten post .

public static IWebHost MigrateDatabase(this IWebHost webHost)
{
    using (var scope = webHost.Services.CreateScope())
    {
        var services = scope.ServiceProvider;

        try
        {
            var db = services.GetRequiredService<MyContext>();
            db.Database.Migrate();
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while migrating the database.");
        }
    }

    return webHost;
}
public static void Main(string[] args)
{
    BuildWebHost(args)
        .MigrateDatabase()
        .Run();
}
user2771704
źródło
2
Nadal otrzymuję: Dodaj implementację „IDesignTimeDbContextFactory <DatabaseContext>” ......
Reft
4

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 ”.

Rtype
źródło
Dzięki, to też mi pomogło.
Siergiej
3

Z

https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation

Podczas tworzenia nowej aplikacji ASP.NET Core 2,0 ten hak jest dołączany domyślnie. W poprzednich wersjach EF Core i ASP.NET Core narzędzia próbują wywołać Startup.ConfigureServices bezpośrednio w celu uzyskania dostawcy usług aplikacji, ale ten wzorzec nie działa już poprawnie w aplikacjach ASP.NET Core 2,0. W przypadku uaktualniania aplikacji ASP.NET Core 1.x do wersji 2,0 możesz zmodyfikować klasę Program, aby była zgodna z nowym wzorcem.

Dodaj fabrykę w .Net Core 2.x

public class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext>
    {
        public BloggingContext CreateDbContext(string[] args)
        {
            var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
            optionsBuilder.UseSqlite("Data Source=blog.db");

            return new BloggingContext(optionsBuilder.Options);
        }
    }
Anton Swanevelder
źródło
3

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

Ali Ahmadi
źródło
Dziękuję, jedynym rozwiązaniem, które zadziałało, było ustawienie projektu internetowego jako projektu startowego i właśnie to należało zrobić.
user3012760
3

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.

codeYouLaterBro
źródło
2

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;

public static void Main(string[] args)
{
    var host = BuildWebHost(args);

    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        try
        {
            var context = services.GetRequiredService<MyDbConext>();
            DbInitializer.Initialize(context);
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while seeding the database.");
        }
    }

    host.Run();
}

Miguel Torres C
źródło
2

W moim przypadku problem wystąpił, ponieważ w moim pliku Startup.cs została wywołana metoda o nazwie SeedData.EnsurePopulated () .

public class Startup
{
    public Startup(IConfiguration configuration) => Configuration = configuration;
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        //
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseDeveloperExceptionPage();
        app.UseStatusCodePages();
        app.UseStaticFiles();
        app.UseSession();
        app.UseMvc(routes =>
        {
            //
        });

        SeedData.EnsurePopulated(app);
    }
}

Prace SeedData klasie jest dodanie początkową danych do tabeli bazy danych. Jego kod to:

public static void EnsurePopulated(IApplicationBuilder app)
    {
        ApplicationDbContext context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>();
        context.Database.Migrate();
        if (!context.Products.Any())
        {
            context.Products.AddRange(
            new Product
            {
                Name = "Kayak",
                Description = "A boat for one person",
                Category = "Watersports",
                Price = 275
            },
            ....
            );
            context.SaveChanges();
        }
    }

ROZWIĄZANIE

Przed wykonaniem migracji po prostu zakomentuj wywołanie klasy SeedData w pliku Startup.cs.

// SeedData.EnsurePopulated(app);

To rozwiązało mój problem i mam nadzieję, że Twój problem również został rozwiązany w ten sam sposób.

yogihosting
źródło
1

Napotkałem ten sam problem. Mam w rozwiązaniu dwa projekty. który

  1. API
  2. Usługi i repozytorium, które przechowują modele kontekstowe

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:

otwórz eksplorator rozwiązań >> kliknij prawym przyciskiem myszy projekt kontekstowy >> wybierz Ustaw jako projekt startowy

Vikas
źródło
1

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

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection"), x => x.MigrationsAssembly("<Your Project Assembly name where DBContext class resides>")));
immirza
źródło
1

Korzystanie z ASP.NET Core 3.1 i EntityFrameWorkCore 3.1.0. Zastępowanie OnConfiguring klasy kontekstu tylko za pomocą konstruktora bez parametrów

```protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
               .SetBasePath(Directory.GetCurrentDirectory())
               .AddJsonFile("appsettings.json")
               .Build();
            var connectionString = configuration.GetConnectionString("LibraryConnection");
            optionsBuilder.UseSqlServer(connectionString);
        }
    }
```
Francis
źródło
1

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

 dotnet ef migrations add InitialMigration --project "Blog.Infrastructure" --startup-project "Blog.Appication"

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.

dotnet ef database update --project "Blog.Infrastructure" --startup-project "Blog.Application"
Manzur Alahi
źródło
0

Mam ten sam problem, odkąd odnosiłem się do starego - Microsoft.EntityFrameworkCore.Tools.DotNet

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

Po aktualizacji do nowszej wersji problem został rozwiązany

vinayak hegde
źródło
0

W pliku appsettings.json głównego projektu ustawiłem „Kopiuj do katalogu wyjściowego” na „Kopiuj zawsze” i zadziałało.

geet
źródło
0

Przykładowa klasa kontekstu bazy danych dla aplikacji konsolowych .net core

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using System.IO;

namespace EmailServerConsole.Data
{
    public class EmailDBContext : DbContext
    {
        public EmailDBContext(DbContextOptions<EmailDBContext> options) : base(options) { }
        public DbSet<EmailQueue> EmailsQueue { get; set; }
    }

    public class ApplicationContextDbFactory : IDesignTimeDbContextFactory<EmailDBContext>
    {
        EmailDBContext IDesignTimeDbContextFactory<EmailDBContext>.CreateDbContext(string[] args)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();
            var builder = new DbContextOptionsBuilder<EmailDBContext>();
            var connectionString = configuration.GetConnectionString("connection_string");
            builder.UseSqlServer(connectionString);
            return new EmailDBContext(builder.Options);
        }
    }
}
Isanka Thalagala
źródło
Chociaż może to odpowiedzieć na pytanie autorów, brakuje w nim słów wyjaśniających i linków do dokumentacji. Fragmenty surowego kodu nie są zbyt pomocne bez niektórych fraz dookoła. Może się również okazać, że bardzo pomocne może być napisanie dobrej odpowiedzi . Zmień swoją odpowiedź.
cześć
0

Możesz również użyć w konstruktorze klasy startowej, aby dodać plik json (gdzie znajdują się parametry połączenia) do konfiguracji. Przykład:

    IConfigurationRoot _config;
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json");

        _config = builder.Build();
    }
Vio
źródło
0

Dla mnie to dlatego, że zmieniłem Output Typeprojekt startowy z Console Applicationna Class Library.

Wracając do załatwienia Console Applicationsprawy.

Robouste
źródło
0

Miałem ten problem w rozwiązaniu, które ma:

  • projekt .NET Core 2.2 MVC
  • projekt .NET Core 3.0 Blazor
  • Kontekst bazy danych w projekcie biblioteki klas .NET Standard 2.0

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

tomRedox
źródło
0

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.

mark_h
źródło
0

W moim przypadku pomaga ustawienie projektu StartUp w init. Możesz to zrobić, wykonując

dotnet ef migrations add init -s ../StartUpProjectName
B.Kosmowski
źródło
-4

Miałem ten sam problem. Po prostu zmieniłem ap.jason na application.jason i rozwiązano problem

AliAzra
źródło