webentwicklung-frage-antwort-db.com.de

Hinzufügen einer Implementierung von 'IDesignTimeDbContextFactory <DataContext>' zum Projekt in asp.net-core-2.0

Hier sind die Liste der Pakete, die ich installiert habe: Installierte Pakete

Ich verwende Entityframework Core 2.0. Zum ersten Mal habe ich erfolgreich eine Datenbank mit dem ersten Migrationscode für das Entity Framework erstellt (Befehl add-migration und update-database) .. Wenn ich nun meine Entitäten aktualisiere und versuche, die Migration auszuführen, wird mir der folgende Fehler angezeigt.

Ein Objekt vom Typ 'DataContext' kann nicht erstellt werden. Fügen Sie dem Projekt eine Implementierung von 'IDesignTimeDbContextFactory' hinzu oder sehen Sie unter https://go.Microsoft.com/fwlink/?linkid=851728 weitere Muster, die zur Entwurfszeit unterstützt werden. 

Hier ist mein Code ... 

Program.cs

public static void Main(string[] args)
{
    BuildWebHost(args).Run();
}

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

Startup.cs

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    // Repositories

    services.AddMvc();
    services.AddDbContextPool<DataContext>(
        options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        //options => options.UseSqlServer(@"Server=LAPTOP-518D8067;Database=Gyanstack;Trusted_Connection=True;MultipleActiveResultSets=true"));

    services.AddCors();
    services.AddScoped<ISectionRepository, SectionRepository>();
    services.AddScoped(typeof(IEntityBaseRepository<>), typeof(EntityBaseRepository<>));
}

DataContext.cs

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

    public DbSet<Section> Section { get; set; }
    public DbSet<SubSection> SubSection { get; set; }
    public DbSet<Article> Article { get; set; }
    public DbSet<Comment> Comment { get; set; }
    public DbSet<User> User { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.AddConfiguration(new SectionMap());
        modelBuilder.AddConfiguration(new SubSectionMap());
        modelBuilder.AddConfiguration(new ArticleMap());
        modelBuilder.AddConfiguration(new CommentMap());
    }
}
16
M J

EDIT: jetzt veraltet. Microsoft hat sein Migrationsdokument Ende September aktualisiert, um zu zeigen, wie Sie die Aktualisierung durchführen, sodass Sie diese Problemumgehung nicht benötigen.

Wie in dieser Ausgabe von github zu sehen ist, verschieben Sie Ihren DB-Initialisierungscode in den Programmhauptbereich und setzen ihn zwischen BuildWebHost () und .Run ().

Es ist relativ einfach, sobald Sie verstanden haben, dass Sie den DB-Kontext mit var context = services.GetRequiredService<MyContext>(); in Main abrufen müssen, und alles funktioniert wie erwartet. (Obwohl ich immer noch denke, dass die DB-Initialisierung eine einmalige Initialisierungssache ist, nicht eine Sache, die von jedem Programm ausgeführt wird)

12
gbjbaanb

Einfach meine Program.cs geändert

davon

public class Program
{
  public static void Main(string[] args)
  {
    var Host = new WebHostBuilder()
      .UseKestrel()
      .UseContentRoot(Directory.GetCurrentDirectory())
      .UseIISIntegration()
      .UseStartup<Startup>()
      .Build();

    Host.Run();
  }
}

zu diesem

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

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

Quelle: https://wildermuth.com/2017/07/06/Programm-cs-in-ASP-NET-Core-2-0

5
Srinivas M. P.

Für mich habe ich meine DBContext Klasse mit Constructor Injection gemacht und es gibt diesen Fehler. Ich bin zurückgekehrt, um einen parameterlosen Konstruktor zu haben, als er funktioniert.

1
Dipen Lama

Verschieben Sie in 2.0-Projekten den Aufruf SeedData.Initialize in die Methode Main von Program.cs:

var Host = BuildWebHost(args);

using (var scope = Host.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    try
    {
        SeedData.Initialize(services, "").Wait();
    }
    catch (Exception ex)
    {
        var logger = services.GetRequiredService<ILogger<Program>>();
        logger.LogError(ex, "An error occurred seeding the DB.");
    }
}

Host.Run();   

Referenz: https://docs.Microsoft.com/de-de/aspnet/core/migration/1x-to-2x/#move-database-initialization-code

1

Ich hatte das gleiche Problem auf dem neuesten .Net Core 2.0.3. Ich habe ein separates Projekt mit der dbContext -Implementierung (von meiner benutzerdefinierten Schnittstelle IUnitOfWork), und die Migration war zunächst einwandfrei. Nachdem ich jedoch eine andere Infrastruktur implementiert habe, habe ich einen ähnlichen Fehler erhalten:

Ein Objekt des Typs 'TestCoreUnitOfWork' kann nicht erstellt werden. Fügen Sie eine Implementierung von 'IDesignTimeDbContextFactory' in des Projekts oder unter https://go.Microsoft.com/fwlink/?linkid=851728 für zusätzliche Muster werden zur Entwurfszeit unterstützt.

Die vorgeschlagene Lösung für die Implementierung IDesignTimeDbContextFactory ist in Ordnung, aber ich habe mich gefragt, warum Migrationen zuvor funktioniert haben. Ich habe einige Stunden damit verbracht, herauszufinden, welche Codeänderung die Migration bricht Es stellte sich heraus, dass es eine Initialisierung des Bootstrappers war, bei der ich alle referenzierten Assemblys (über Assembly.Load ()) von meiner Lösung aus geladen habe - Die Migration begann wieder zu funktionieren.

Zusammenfassend und zur Beantwortung der Frage gibt es einen möglichen Grund für den Migrationsfehler - mithilfe von Assembly.Load () in StartUp.ConfigureServices ().

Ich hoffe es wird für jemanden nützlich sein.

1
Pavel K.

Dieser Fehler ist bei der Verwendung von Npgsql.EntityFrameworkCore.PostgreSQL aufgetreten, wenn es darauf ankommt.

Unter Berücksichtigung https://docs.Microsoft.com/de-de/aspnet/core/migration/1x-to-2x/#add-configuration-providers

Ich habe dies zu BuildWebHost () hinzugefügt

.ConfigureAppConfiguration((hostContext, config) =>
{
    // delete all default configuration providers
    config.Sources.Clear();
    config.AddJsonFile("appsettings.json", optional: true);
})

so kam es:

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .ConfigureAppConfiguration((hostContext, config) =>
    {
        // delete all default configuration providers
        config.Sources.Clear();
        config.AddJsonFile("appsettings.json", optional: true);
    })
    .Build();

Jetzt gehts

0
mkb

Das Problem ist mit dem Seeding von db von Startup.Configure ... Sie können es immer noch mit dieser Arbeit umgehen. Getestet und funktionierte gut

https://garywoodfine.com/how-to-seed-your-ef-core-database/

0
Nick G.

Es sieht so aus, als würde EF 2.0 nicht mit "Beispieldaten" arbeiten, was von der alten Netzkernvorlage des Projekts erhalten bleibt.

SampleData.Initialize(app.ApplicationServices);

Meiner Ansicht nach 

var context = serviceProvider.GetService<ApplicationDbContext>();
context.Database.Migrate();

fälle dieser Fehler. Ich bin nicht sicher, ob dieses Update korrekt ist, aber es funktioniert.

0
sibvic

Einige Leute sagten, dass Sie Ihre Startup.cs-Klasse ändern müssen, aber ich tue nichts davon, ich habe nur ein wenig meine Program.cs-Klasse geändert

---------- Alte Datei --------------

public class Program
{
    public static void Main(string[] args)
    {
        var Host = CreateWebHostBuilder(args).Build();

        using (var scope = Host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<MvcMovieContext>();
                context.Database.Migrate();
                SeedData.Initialize(services);
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred seeding the DB.");
            }
        }

        Host.Run();
    }

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

----------Neue Datei---------

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

        using (var scope = Host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;
            try
            {
                var dbContext = scope.ServiceProvider.GetService<MvcMovieContext>();
                //SeeData is a class in my Models folder
                SeedData.Initialize(services);
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred seeding the DB.");
            }
        }
        Host.Run();
    }

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

Dies hängt mit dem neuen Init-Prozess von .NET Core 2.0 zusammen, bei dem die Konfiguration anders gehandhabt wird (Details hier ).

Wenn Sie ein Upgrade von 1.x durchgeführt haben, ändern Sie Ihren Program.cs und Startup.cs:

public class Program
{
    public static void Main(String[] args)
    {
        Program.BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(String[] args) =>
        WebHost.CreateDefaultBuilder(args)
               .UseKestrel()
               .UseUrls("http://*:8000")
               .UseStartup<Startup>()
               .Build();
}

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

    public IConfiguration Configuration { get; }

    ........
}

Nach dieser Änderung sollten Ihre Migrationen funktionieren und es ist keine Implementierung von IDesignTimeDbContextFactory erforderlich.

0
Tobias Punke