web-dev-qa-db-fra.com

Impossible de créer un objet de type 'MyContext'. Pour les différents modèles pris en charge au moment de la conception

J'ai ConsoleApplication sur .NET Core et j'ai également ajouté mon DbContext aux dépendances, mais cependant j'ai une erreur:

Impossible de créer un objet de type 'MyContext'. Pour les différents modèles pris en charge au moment de la conception, voir https://go.Microsoft.com/fwlink/?linkid=851728

j'ai ajouté: var context = Host.Services.GetRequiredService<MyContext>(); J'ai aussi ajouté private readonly DbContextOptions<MyContext> _opts; dans ma classe Post:

using (MyContext db = new MyContext(_opts))
 {
 db.Posts.Add(postData);
 db.SaveChanges();
 }

Voici comment j'ai ajouté le service:

.ConfigureServices((context, services) =>
                {
                    services.Configure<DataOptions>(opts =>
                        context.Configuration.GetSection(nameof(DataOptions)).Bind(opts));
                    services.AddDbContext<MyContext>((provider, builder) =>
                        builder.UseSqlite(provider.GetRequiredService<IOptions<DataOptions>>().Value.ConnectionString));

Et voici mon contexte:

public sealed class MyContext : DbContext
    {
        private readonly DbContextOptions<MyContext> _options;

        public DbSet<PostData> Posts { get; set; }
        public DbSet<VoteData> Votes { get; set; }


        public MyContext(DbContextOptions<MyContext> options) : base(options)
        {
            _options = options;
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlite("ConnectionString");
            }
        }

    }

J'ai essayé la migration par ajout et j'ai cette erreur

Ce que je fais mal?

6
Taifunov

J'ai eu le même problème que toi. Peut-être que ce n'était pas pour une application console, mais l'erreur était la même. J'ai donc pensé qu'il valait la peine de partager ma réponse. J'utilisais NET Core 3. et pour résoudre le problème, je dois changer IHostBuilder en IWebHost et puis tout allait bien. Le problème était dans le programme de classe.

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

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

dans

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

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

Veuillez vérifier votre chaîne de connexion également dans le jeu d'applications, json.

1
Suchi

La solution rapide au problème consiste à implémenter le constructeur par défaut dans votre contexte

 public MyContext() : base()
 {
 }

Le problème avec cette solution est que vous devrez entrer explicitement la chaîne de connexion dans la fonction 'OnConfiguring', ce qui n'est pas recommandé

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlite("ConnectionString");
        }
 }
1
Propeus