4
votes

Impossible de créer un objet de type 'DbContext'

Quand j'essaye de courir

Using project '/home/msek/Projects/inz/CrossX/src/CrossX.Identity/CrossX.Identity.csproj'.
Using startup project '/home/msek/Projects/inz/CrossX/src/CrossX.Identity/CrossX.Identity.csproj'.
Writing '/home/msek/Projects/inz/CrossX/src/CrossX.Identity/obj/CrossX.Identity.csproj.EntityFrameworkCore.targets'...
dotnet msbuild /target:GetEFProjectMetadata /property:EFProjectMetadataFile=/tmp/tmpCq3PQa.tmp /verbosity:quiet /nologo /home/msek/Projects/inz/CrossX/src/CrossX.Identity/CrossX.Identity.csproj
Writing '/home/msek/Projects/inz/CrossX/src/CrossX.Identity/obj/CrossX.Identity.csproj.EntityFrameworkCore.targets'...
dotnet msbuild /target:GetEFProjectMetadata /property:EFProjectMetadataFile=/tmp/tmpR48yu8.tmp /verbosity:quiet /nologo /home/msek/Projects/inz/CrossX/src/CrossX.Identity/CrossX.Identity.csproj
dotnet build /home/msek/Projects/inz/CrossX/src/CrossX.Identity/CrossX.Identity.csproj /verbosity:quiet /nologo

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:01.17
dotnet exec --depsfile /home/msek/Projects/inz/CrossX/src/CrossX.Identity/bin/Debug/netcoreapp2.2/CrossX.Identity.deps.json --additionalprobingpath /home/msek/.nuget/packages --runtimeconfig /home/msek/Projects/inz/CrossX/src/CrossX.Identity/bin/Debug/netcoreapp2.2/CrossX.Identity.runtimeconfig.json /home/msek/.dotnet/tools/.store/dotnet-ef/2.2.2/dotnet-ef/2.2.2/tools/netcoreapp2.2/any/tools/netcoreapp2.0/any/ef.dll migrations add Init --assembly /home/msek/Projects/inz/CrossX/src/CrossX.Identity/bin/Debug/netcoreapp2.2/CrossX.Identity.dll --startup-assembly /home/msek/Projects/inz/CrossX/src/CrossX.Identity/bin/Debug/netcoreapp2.2/CrossX.Identity.dll --project-dir /home/msek/Projects/inz/CrossX/src/CrossX.Identity/ --language C# --working-dir /home/msek/Projects/inz/CrossX/src/CrossX.Identity --verbose --root-namespace CrossX.Identity
Using assembly 'CrossX.Identity'.
Using startup assembly 'CrossX.Identity'.
Using application base '/home/msek/Projects/inz/CrossX/src/CrossX.Identity/bin/Debug/netcoreapp2.2'.
Using working directory '/home/msek/Projects/inz/CrossX/src/CrossX.Identity'.
Using root namespace 'CrossX.Identity'.
Using project directory '/home/msek/Projects/inz/CrossX/src/CrossX.Identity/'.
Finding DbContext classes...
Finding IDesignTimeDbContextFactory implementations...
Finding application service provider...
Finding IWebHost accessor...
No CreateWebHostBuilder(string[]) method was found on type 'CrossX.Identity.Program'.
No application service provider was found.
Finding DbContext classes in the project...
Found DbContext 'IdentityContext'.
Microsoft.EntityFrameworkCore.Design.OperationException: Unable to create an object of type 'IdentityContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728 ---> System.MissingMethodException: No parameterless constructor defined for this object.
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean wrapExceptions, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean wrapExceptions, Boolean skipCheckThis, Boolean fillCache)
   at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.<>c__DisplayClass12_3.<FindContextTypes>b__13()
   --- End of inner exception stack trace ---
   at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.<>c__DisplayClass12_3.<FindContextTypes>b__13()
   at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func`1 factory)
   at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Unable to create an object of type 'IdentityContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728

Je reçois une erreur

Impossible de créer un objet de type «IdentityContext».

Je sais ce qui a causé le problème. Je voulais apprendre à utiliser le bus de messages et l'ai ajouté à mon projet, alors j'ai suivi un cours et l'ai implémenté. Le bus Ofc fonctionne parfaitement. Mais le problème est que je ne peux plus migrer via EF.

Mon Startup.cs était auparavant.

  public class IdentityContext : DbContext
  {
    public IdentityContext(DbContextOptions<IdentityContext> options) : base(options)
    {
      while (!Debugger.IsAttached)
      {
        Thread.Sleep(100);
      }
    }
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
      modelBuilder.Entity<User>().HasIndex(user => user.Email).IsUnique();
      modelBuilder.Entity<User>().HasIndex(user => user.Username).IsUnique();
    }
  }

Maintenant, ça ressemble à ça.

services.AddEntityFrameworkNpgsql().AddDbContext<IdentityContext>(options =>
    options.UseNpgsql(Configuration.GetConnectionString("IdentityConnection")));

Et classe ServiceHost

public void Run() => _webHost.Run();

public static HostBuilder Create<TStartup>(string[] args) where TStartup : class
{
  Console.Title = typeof(TStartup).Namespace;
  var config = new ConfigurationBuilder()
    .AddEnvironmentVariables()
    .AddCommandLine(args)
    .Build();
  var webHostBuilder = WebHost.CreateDefaultBuilder()
    .UseConfiguration(config)
    .UseStartup<TStartup>();

  return new HostBuilder(webHostBuilder.Build());
}

Donc, n'importe qui pourrait donner des conseils sur les raisons pour lesquelles la migration s'est arrêtée pour fonctionner? Pour moi, cela devrait fonctionner, mais ce n'est pas le cas, je suppose que je me trompe.

Et ofc j'ai dans mon Startup.cs

public static void Main(string[] args)
{
  ServiceHost.Create<Startup>(args)
    .UseRabbitMq()
    .Build()
    .Run();
}

EDIT Classe IdentityContext:

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

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

EDIT2. Migration verbeuse

dotnet ef migration add Init


6 commentaires

J'ai toujours enregistré le contexte de base de données en utilisant des postgres comme ceci: services.AddDbContext<IdentityContext>(options => options.UseNpgsql(Configuration.GetConnectionString("Identit‌​yConnection"))); Pourriez-vous essayer de vérifier si cela fonctionne?


Même erreur. Impossible de créer un objet de type «IdentityContext».


Avez-vous débogué et vérifié que la classe de démarrage est appelée correctement?


Que faire si vous changez ceci: var webHostBuilder = WebHost.CreateDefaultBuilder() .UseConfiguration(config) .UseStartup<TStartup>(); return new HostBuilder(webHostBuilder.Build()); pour return WebHost.CreateDefaultBuilder() .UseConfiguration(config) .UseStartup<TStartup>();


@carloschourio J'ai débogué et je ne vois aucun problème.


@carloschourio Impossible de convertir le type d'expression «Microsoft.AspNetCore.Hosting.IWebHostBuilder» pour renvoyer le type «CrossX.Common.Services.ServiceHost.HostBuilder»


3 Réponses :


2
votes

On dirait que vous avez implémenté IdentityContext, mais quelque part dans votre application, il essaie toujours de faire référence à DbContext. Assurez-vous qu'Identitycontext étend DbContext.

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

EDIT: Implémentation de IDesignTimeDbContextFactory comme indiqué dans https://docs.microsoft.com/en-gb/ef/core/miscellaneous/cli/dbcontext-creation


8 commentaires

J'ai joint la classe IdentityContext. Son extension DbContext. Et comme je l'ai dit, cela fonctionnait avant de changer Startup.cs, donc je suppose qu'il est correctement implémenté. Enfin dans cette partie.


Je vois dans l'ancien démarrage que vous passiez les arguments à CreateWebHostBuilder et dans le ServiceHost, vous ne le transmettez pas.


quelle version dot net core utilisez-vous?


# dotnet - version # 2.2.105


exécutez add-migration initial -verbose et voyez quelle erreur sous-jacente cela donne


Migration détaillée jointe.


Essayez d'implémenter IDesignTimeDbContextFactory comme indiqué dans docs.microsoft.com/en-gb/ef/core/miscellaneous/cli/… ou codingblast.com / ...


c'était une solution. Au moins, il semble être :) Il a créé une table et connecté à db. Je me demande pourquoi cela arrive. J'aurai besoin de creuser dedans.



1
votes

Mon problème était que je n'avais pas défini mon projet api à partir de la solution en tant que projet de démarrage afin qu'il ne trouve pas Startup.cs ou qch comme ça.


0 commentaires

0
votes

Créez une méthode dans la classe Program nommée CreateWebHostBuilder . Déplacez le corps de votre méthode principale vers cette classe et appelez cette classe à partir de la méthode Main. La nouvelle mise en œuvre serait:

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

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    ServiceHost.Create<Startup>(args)
                .UseRabbitMq()
                .Build()
                .Run();

L'outil ef examine la méthode CreateWebHostBuilder et renvoie une erreur en cas d'échec de la recherche.


0 commentaires