web-dev-qa-db-ja.com

タイプ「MyContext」のオブジェクトを作成できません。設計時にサポートされるさまざまなパターンについて

.NET CoreにConsoleApplicationがあり、DbContextを依存関係に追加しましたが、エラーが発生します。

タイプ「MyContext」のオブジェクトを作成できません。設計時にサポートされるさまざまなパターンについては、 https://go.Microsoft.com/fwlink/?linkid=851728 を参照してください

追加しました:var context = Host.Services.GetRequiredService<MyContext>();また追加しましたprivate readonly DbContextOptions<MyContext> _opts;私のPostクラス:

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

これは私がサービスを追加した方法です:

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

そして、これは私のコンテキストです:

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

    }

追加移行を試みましたが、このエラーが発生しました

私は何を間違っていますか?

6
Taifunov

私はあなたと同じ問題を抱えていました。多分それはコンソールアプリケーションのためではありませんが、エラーは同じでした。だから私は私の答えと共有する価値があると思いました。私はNET Core 3.を使用していて、問題を修正するにはIHostBuilderIWebHostに変更する必要があります。問題はクラスのプログラムにありました。

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

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

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

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

Appsetting、jsonでも接続文字列を確認してください。

1
Suchi

問題の迅速な解決策は、コンテキストにデフォルトのコンストラクターを実装することです

 public MyContext() : base()
 {
 }

このソリューションの問題は、「OnConfiguring」関数に接続文字列を明示的に入力する必要があることです。これは推奨されません。

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