Nach dem Upgrade auf ASP.NET Core 2.0 können keine Migrationen erstellt werden


109

Nach dem Upgrade auf ASP.NET Core 2.0 kann ich anscheinend keine Migrationen mehr erstellen.

Ich erhalte

"Beim Aufrufen der Methode 'BuildWebHost' für die Klasse 'Program' ist ein Fehler aufgetreten. Fortsetzung ohne den Anwendungsdienstanbieter. Fehler: Ein oder mehrere Fehler sind aufgetreten. (Die vom Anmelden angeforderte Datenbank" ... "kann nicht geöffnet werden. Die Anmeldung ist fehlgeschlagen. Anmeldung fehlgeschlagen für Benutzer '...' "

und

"Ein Objekt vom Typ 'MyContext' kann nicht erstellt werden. Fügen Sie dem Projekt eine Implementierung von 'IDesignTimeDbContextFactory' hinzu, oder lesen Sie https://go.microsoft.com/fwlink/?linkid=851728, um weitere Muster zu erhalten, die zur Entwurfszeit unterstützt werden."

Der Befehl, den ich zuvor ausgeführt habe, war $ dotnet ef migrations add InitialCreate --startup-project "..\Web"(aus dem Projekt / Ordner mit dem DBContext).

Verbindungszeichenfolge: "Server=(localdb)\\mssqllocaldb;Database=database;Trusted_Connection=True;MultipleActiveResultSets=true"

Das ist mein 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();
}

3
Möglicherweise liegt das Problem nicht in Program.cs. Es ist wahrscheinlich die Verwendung einer Anweisung zum Laden von Startdaten am Ende Ihrer Configure-Methode: DbInitializer.Initialize (context); Wenn Sie diese Anweisung haben, kommentieren Sie sie: //DbInitializer.Initialize(context); Führen Sie dann die zu testenden Migrationsanweisungen aus. Wenn das Problem auftritt, folgen Sie der Klasse DbInitializer.cs.
Miguel Torres C

1
Befindet sich Ihre MyContext-Klasse in einem anderen Klassenbibliotheksprojekt?
Orhun

Gleiches Problem hier, Kontext ist in einer anderen Bibliothek. Wenn id dem Kontext einen Parameter weniger consturctor hinzufügt, funktionieren Migrationen, jedoch mit demselben Fehler: (Beim Aufrufen der Methode 'BuildWebHost' für die Klasse 'Program' ist ein Fehler aufgetreten. Fortsetzung ohne den Anwendungsdienstanbieter. Fehler: Objektreferenz nicht festgelegt zu einer Instanz eines Objekts.)
iBoonZ

Hast du es am Ende gelöst bekommen?
Konrad Viltersten

@ MiguelTorresC danke für diesen Kommentar. Ich kommentierte meine Seeding-Methoden aus und Migrationen begannen wieder zu funktionieren. Danke vielmals !!!
Amit Philips

Antworten:


123

Sie können eine Klasse hinzufügen, die IDesignTimeDbContextFactory in Ihrem Webprojekt implementiert.

Hier ist der Beispielcode:

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);
    }
}

Navigieren Sie dann zu Ihrem Datenbankprojekt und führen Sie Folgendes über die Befehlszeile aus:

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.

Ressource


2
Ich erhalte: Die Konfigurationsdatei 'appsettings.json' wurde nicht gefunden und ist nicht optional. Der physische Pfad lautet "C: \ Benutzer \ XXX \ Dokumente \ Visual Studio 2017 \ Projekte \ XXX \ src \ XXX.Api \ bin \ Debug \ netcoreapp2.0 \ appsettings.json". Meine Apps befinden sich in C: \ Benutzer \ XXX \ Dokumente \ Visual Studio 2017 \ Projekte \ XXX \ src \ XXX.Api.
Reft

Stellen Sie sicher, dass Sie die Datei appsettings.json so eingestellt haben, dass sie lokal kopiert wird, um das Problem zu beheben, dass sie nicht gefunden wird
DaImTo

1
Diese Lösung führt eine Abhängigkeit von Entity Framework in Ihre Hostanwendung ein (in meinem Fall ist dies ein Webprojekt). Gibt es eine Möglichkeit, dies zu umgehen? Ich möchte, dass meine Repository-Bibliothek das EF-Material enthält und EF nicht in die Web-App einführt.
Banoona

Obwohl dies die akzeptierte Antwort ist, ist diese besser: stackoverflow.com/a/52671330/1737395 In der Tat hilft das Ausführen der Migration mit dem Flag --verbose sehr
barbara.post

73

Keine Notwendigkeit für IDesignTimeDbContextFactory.

Lauf

add-migration initial -verbose

das wird die Details unter enthüllen

Beim Zugriff auf den IWebHost in der Klasse 'Programm' ist ein Fehler aufgetreten. Fortsetzung ohne den Anwendungsdienstleister.

Warnung, die die Hauptursache des Problems ist.

In meinem Fall bestand das Problem darin, einen Fehler zu haben ApplicationRole : IdentityRole<int>und aufzurufen, services.AddIdentity<ApplicationUser, IdentityRole>()der den folgenden Fehler verursachte

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

3
Ja - Verbose hilft dabei, das eigentliche Problem aufzudecken. In meinem Fall wurden dem Start keine AddDbContext-Dienste hinzugefügt.
Sudhakarssd

3
dotnet ef migrations add InitialCreate --verbose
barbara.post

4
@tchelidze Vielen Dank dafür, in meinem Fall hatte ich keinen parameterlosen Konstruktor in meinem ApplicationDbContext.
Tiago Ávila

1
Dies ist ein fantastischer Tipp, sollte die akzeptierte Antwort sein
Avrohom Yisroel

1
Vielen Dank, dies hat mir geholfen, mein Problem zu finden und es zu lösen. In meinem Fall war es ein "Kein parameterloser Konstruktor für den Typ 'Data.Access.DAL.MainDbContext' definiert.", Und deshalb habe ich die Parameter einfach aus dem Konstruktor entfernt und es hat wie Magie funktioniert!
Sarah

25

Lösung 1: (Finden Sie das Problem in 99% der Fälle)

Legen Sie das Webanwendungsprojekt als Startprojekt fest

Führen Sie die folgenden Befehle mit -verboseOption aus.

Add-Migration Init -Verbose

-verbose Option hilft, das eigentliche Problem tatsächlich aufzudecken. Sie enthält detaillierte Fehler.

Lösung 2:

Umbenennen BuildWebHost()in CreateWebHostBuilder(), da Entity Framework Core toolserwartet wird, dass eine CreateHostBuilderMethode gefunden wird, die den Host konfiguriert, ohne die App auszuführen.

.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

Umbenennen BuildWebHost()inCreateHostBuilder()

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>();
            });
}

Lösung 3:

Stellen Sie sicher, dass Sie Dbcontextzur Abhängigkeitsinjektion hinzugefügt haben : AddDbContext<TContext>Stellt sowohl Ihren DbContext-Typ TContextals auch den entsprechenden Typ DbContextOptions<TContext>für die Injektion aus dem Service-Container zur Verfügung. Dazu muss Ihrem DbContextTyp ein Konstruktorargument hinzugefügt werden , das akzeptiert DbContextOptions<TContext>.

Beispiel: In Startup.cs

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

AppDbContext- Code:

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

}

1
Das hat bei mir funktioniert. Die BuildWebHost-Funktion in Program.cs wurde von public static IWebHostBuilder BuildWebHost(string[] args)auf public static IWebHost BuildWebHost(string[] args)die .Build()jetzt in der Funktion enthaltene
geändert

1
Leute, wenn Sie ASP.NET Core 2.1+ verwenden, hat die BuildWebHost-Methode aufgrund von docs.microsoft.com/en-us/aspnet/core/migration/… einen anderen Namen - CreateWebHostBuilder. Benennen Sie CreateWebHostBuilder in BuildWebHost um, und die Migration wird gefunden BuildWebHost und nimm DbContext daraus.
KEMBL

2
Vielen Dank Kumpel, gelöst nach 2 Stunden zu konfigurieren ohne zu verwendenIDesignTimeDbContextFactory
Azri Zakaria

3
Danke für die "-Verbose" -Flagge. Es hat mir geholfen, die Grundursache für die Ausnahme zu finden.
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();
    }
}

Einfach umbenennen BuildWebHost()in CreateWebHostBuilder(), da Migrationen diese Methode standardmäßig verwenden.


4
WAS. Dies sollte auf jeder Seite beworben werden, die sich mit diesem Problem befasst, wenn Sie es ernst meinen . Sofortiger Erfolg. Danke dir.
Chaim Eliyah

Rette meinen Tag !!! Es ist ein sehr seltsamer Fehler. Ich verwende .net Core 3.0 mit Vorschau 7 und dieser Fehler existiert immer noch
D Todorov

@DTodorov lesen Sie diese devblogs.microsoft.com/dotnet/…
sherox

D Todorov Benennen Sie BuildWebHost () einfach in CreateHostBuilder () um
Ali Bayat

1
@WernerCD Cuz Worker verwendet die CreateHostBuilder () -Methode, die IHostBuilder von Net Core 3
implementiert

11

In meinem Fall war die Ursache des Problems mehrere Startprojekte. Ich habe drei Projekte in meiner Lösung: Mvc, Api und Dal. DbContext und Migrationen im Dal-Projekt.

Ich hatte mehrere Startprojekte konfiguriert. Sowohl Mvc- als auch Api-Projekte wurden ausgeführt, als ich auf Start geklickt habe. Aber in diesem Fall bekam ich diesen Fehler.

"Ein Objekt vom Typ 'MyContext' kann nicht erstellt werden. Fügen Sie dem Projekt eine Implementierung von 'IDesignTimeDbContextFactory' hinzu, oder lesen Sie https://go.microsoft.com/fwlink/?linkid=851728, um weitere Muster zu erhalten, die zur Entwurfszeit unterstützt werden."

Ich konnte die Migration erfolgreich hinzufügen, nachdem ich Mvc als einziges Startprojekt festgelegt und Dal in der Package Manager-Konsole ausgewählt hatte.


1
Danke, mir ist so etwas passiert. Ich musste das Startprojekt an den Ort ändern, an dem Start- / Programmklassen vorhanden sind. Die Fehlermeldung ist ein schlechter Witz.
Ľuboš Čurgó

1
Ausgabenachrichten waren wirklich frustrierend. Ich hatte unerwartet kein Startprojekt ausgewählt. Dies war der Grund, warum dbContext nicht erstellt werden konnte. Vielen Dank.
Upkit

1
Vielen Dank, Sir ... Ein Großteil meiner Zeit wird gespart
Naveed Khan

7

Fügen Sie in der AppContext.cs neben der AppContext-Klasse eine weitere Klasse hinzu:

// 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);
    }
}

Dies wird Ihr zweites Problem lösen:

"Objekt vom Typ 'MyContext' kann nicht erstellt werden. Fügen Sie dem Projekt eine Implementierung von 'IDesignTimeDbContextFactory' hinzu.

Danach können Sie Initial migration hinzufügen und ausführen, indem Sie den Befehl update-database ausführen . Wenn Sie diese Befehle jedoch ausführen, wenn sich noch keine Datenbank in Ihrem lokalen SQL Server befindet, wird die Warnung wie bei Ihrem ersten Fehler angezeigt: "Ein Fehler

ist beim Aufrufen der Methode 'BuildWebHost' für die Klasse 'Program' aufgetreten ... Die Anmeldung ist fehlgeschlagen. Login ist fehlgeschlagen für den Benutzer '...'"

Dies ist jedoch kein Fehler, da eine Migration erstellt wird und ausgeführt werden kann. Ignorieren Sie diesen Fehler also zum ersten Mal, und letzteres wird nicht wieder vorkommen, da Db vorhanden sein wird.


4

Bitte überprüfen Sie, ob Sie die Referenz haben

<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />

5
Ich benutze, <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />was diese Referenz enthält. Ich habe auch versucht, die oben genannten einzuschließen, aber keine Änderung.
Ruhm

4

Sie können diese Lösung aus dieser Diskussion ausprobieren , die von diesem Beitrag inspiriert wurde .

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();
}

2
Ich bekomme immer noch: Fügen Sie eine Implementierung von 'IDesignTimeDbContextFactory <DatabaseContext>' hinzu ......
Reft

4

Was mir wirklich geholfen hat, war dieser Artikel: https://elanderson.net/2017/09/unable-to-create-an-object-of-type-applicationdbcontext-add-an-implementation-of-idesigntimedbcontextfactory/

Die Grundidee ist, dass bei der Umstellung von .net Core 1 auf 2 die gesamte Datenbankinitialisierung aus der StartUp.cs in die Program.cs verschoben werden sollte. Andernfalls versuchen die EF-Tasks, Ihre DB-Inits auszuführen, wenn Sie Tasks ausführen.

"In den offiziellen Migrationsdokumenten ( https://docs.microsoft.com/en-us/ef/core/miscellaneous/1x-2x-upgrade ) gibt es einen schönen Abschnitt mit dem Titel" Datenbankinitialisierungscode verschieben ", den ich anscheinend habe Ich habe also sichergestellt, dass dies nicht der Grund ist, warum Sie eine Implementierung von IdesignTimeDbContextFactory hinzufügen müssen. "


Danke, das hat mir auch geholfen.
Sergey

3

Von

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

Wenn Sie eine neue ASP.NET Core 2.0-Anwendung erstellen, ist dieser Hook standardmäßig enthalten. In früheren Versionen von EF Core und ASP.NET Core versuchen die Tools, Startup.ConfigureServices direkt aufzurufen, um den Dienstanbieter der Anwendung zu erhalten. Dieses Muster funktioniert jedoch in ASP.NET Core 2.0-Anwendungen nicht mehr ordnungsgemäß. Wenn Sie eine ASP.NET Core 1.x-Anwendung auf 2.0 aktualisieren, können Sie Ihre Programmklasse so ändern, dass sie dem neuen Muster folgt.

Fügen Sie Factory in .Net Core 2.x hinzu

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);
        }
    }

3

Ich hatte dieses Problem und dieses Problem gelöst durch Set -> Web Application (Included Program.cs) Project to -> "Set as Startup Project"

Führen Sie dann -> add-migration initial -verbose aus

in der Package Manager-Konsole

Als Startprojekt festlegen


Vielen Dank, die einzige Lösung, die für mich funktioniert hat, war, das Webprojekt als Startprojekt festzulegen, und genau das musste getan werden.
user3012760

3

Wenn Sie diese IDesignTimeDbContextFactory-Sache vermeiden möchten: Stellen Sie einfach sicher, dass Sie beim Start keine Seed-Methode verwenden. Ich habe bei meinem Start eine statische Seed-Methode verwendet, die diesen Fehler für mich verursacht hat.


2

Zuvor haben Sie die Startdaten in der Configure-Methode in Startup.cs konfiguriert. Es wird jetzt empfohlen, die Configure-Methode nur zum Einrichten der Anforderungspipeline zu verwenden. Der Anwendungsstartcode gehört zur Main-Methode.

Die überarbeitete Hauptmethode. Fügen Sie der Program.cs die folgenden Verweise hinzu:

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();
}



2

In meinem Fall trat das Problem auf, weil in meiner Datei Startup.cs eine Methode namens SeedData.EnsurePopulated () aufgerufen wurde .

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);
    }
}

Die Arbeit der SeedData- Klasse besteht darin, der Datenbanktabelle Anfangsdaten hinzuzufügen. Der Code lautet:

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();
        }
    }

LÖSUNG

Kommentieren Sie vor der Migration einfach den Aufruf der SeedData- Klasse in der Datei Startup.cs aus.

// SeedData.EnsurePopulated(app);

Das hat mein Problem gelöst und ich hoffe, Ihr Problem wird auch auf die gleiche Weise gelöst.


1

Ich bin auf dasselbe Problem gestoßen. Ich habe zwei Projekte in der Lösung. welche

  1. API
  2. Services und Repo, die Kontextmodelle enthalten

Ursprünglich wurde das API-Projekt als Startprojekt festgelegt.

Ich habe das Startup-Projekt in das Projekt geändert, das Kontextklassen enthält. Wenn Sie Visual Studio verwenden , können Sie ein Projekt als Startprojekt festlegen, indem Sie:

Öffnen Sie den Solution Explorer >> Klicken Sie mit der rechten Maustaste auf das Kontextprojekt >> Wählen Sie Als Startprojekt festlegen


1

Stellen Sie zunächst sicher, dass Sie Ihre Datenbank in konfiguriert haben. Startup.cs In meinem Fall wurde dieser Fehler angezeigt, da ich das Folgende in nicht angegeben habeStartup.cs

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection"), x => x.MigrationsAssembly("<Your Project Assembly name where DBContext class resides>")));

1

Verwenden von ASP.NET Core 3.1 und EntityFrameWorkCore 3.1.0. Überschreiben der OnConfiguring der Kontextklasse nur mit einem parameterlosen Konstruktor

```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);
        }
    }
```

1

Ich war mit dem Fehler konfrontiert

"Ein Objekt vom Typ 'MyContext' kann nicht erstellt werden. Fügen Sie dem Projekt eine Implementierung von 'IDesignTimeDbContextFactory' hinzu, oder lesen Sie https://go.microsoft.com/fwlink/?linkid=851728, um weitere Muster zu erhalten, die zur Entwurfszeit unterstützt werden."

So wurde mein Problem gelöst. Führen Sie den folgenden Befehl aus, während Sie sich in Ihrem Lösungsverzeichnis befinden

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

Hier ist Application mein Startprojekt mit der Klasse Startup.cs und Infrastructure ist mein Projekt mit der Klasse DbContext.

Führen Sie dann das Update mit derselben Struktur aus.

dotnet ef database update --project "Blog.Infrastructure" --startup-project "Blog.Application"

0

Ich habe das gleiche Problem, da ich auf Microsoft.EntityFrameworkCore.Tools.DotNet verwiesen habe

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

Nach dem Upgrade auf die neuere Version wurde es behoben


0

In der Datei appsettings.json des Hauptprojekts hatte ich "In Ausgabeverzeichnis kopieren" auf "Immer kopieren" gesetzt und es funktionierte.


0

Beispiel für eine DB-Kontextklasse für .net-Kernkonsolenanwendungen

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);
        }
    }
}

Dies könnte zwar die Frage des Autors beantworten, es fehlen jedoch einige erklärende Wörter und Links zur Dokumentation. Rohcode-Schnipsel sind ohne einige Ausdrücke nicht sehr hilfreich. Möglicherweise ist es auch sehr hilfreich , eine gute Antwort zu schreiben . Bitte bearbeiten Sie Ihre Antwort.
Gelb

0

Sie können auch im Konstruktor der Startklasse verwenden, um der Konfiguration eine JSON-Datei (in der sich die Verbindungszeichenfolge befindet) hinzuzufügen. Beispiel:

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

        _config = builder.Build();
    }

0

Für mich war es, weil ich das Output Typevon meinem Startup-Projekt von Console Applicationauf geändert habe Class Library.

Zurückkehren Console Applicationhat den Trick getan.


0

Ich hatte dieses Problem in einer Lösung, die hat:

  • ein .NET Core 2.2 MVC-Projekt
  • ein .NET Core 3.0 Blazor-Projekt
  • Der DB-Kontext in einem .NET Standard 2.0-Klassenbibliotheksprojekt

Ich erhalte die Meldung "Objekt kann nicht erstellt werden ...", wenn das Blazor-Projekt als Startprojekt festgelegt ist, nicht jedoch, wenn das MVC-Projekt als Startprojekt festgelegt ist.

Das ist mir ein Rätsel, denn in der Package Manager-Konsole (in der ich die Migration erstelle) habe ich das Standardprojekt auf eine C # -Klassenbibliothek festgelegt, die tatsächlich den DB-Kontext enthält, und ich gebe auch den DB-Kontext in an Mein Aufruf zur Add-Migration add-migration MigrationName -context ContextName, daher scheint es seltsam, dass Visual Studio sich darum kümmert, welches Startprojekt derzeit festgelegt ist.

Ich vermute, der Grund dafür ist, dass die PMC, wenn das Blazor-Projekt das Startprojekt ist, die Version von .NET als Core 3.0 aus dem Startprojekt ermittelt und dann versucht, diese zu verwenden, um die Migrationen in der .NET Standard 2.0-Klasse auszuführen Bibliothek und einen Konflikt irgendeiner Art zu treffen.

Unabhängig von der Ursache wurde das Problem behoben, indem das Startprojekt in das MVC-Projekt geändert wurde, das auf Core 2.2 und nicht auf das Blazor-Projekt abzielt


0

Für mich war das Problem, dass ich die Migrationsbefehle im falschen Projekt ausführte. Durch Ausführen der Befehle innerhalb des Projekts, das die Datei Startup.cs enthielt, und nicht des Projekts, das den DbContext enthielt, konnte ich dieses spezielle Problem überwinden.


0

In meinem Fall hilft es, das StartUp-Projekt in init einzustellen. Sie können dies durch Ausführen tun

dotnet ef migrations add init -s ../StartUpProjectName

-4

Ich hatte das gleiche Problem. Ich habe gerade die ap.jason in application.jason geändert und das Problem behoben

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.