无法创建 'MyContext' 类型的对象。对于设计时支持的不同模式

Unable to create an object of type 'MyContext'. For the different patterns supported at design time

我在 .NET Core 上有 ConsoleApplication 并且我也将我的 DbContext 添加到依赖项,但是我有一个错误:

Unable to create an object of type 'MyContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728

我添加了:var context = host.Services.GetRequiredService<MyContext>(); 我还在 Post Class 中添加了 private readonly DbContextOptions<MyContext> _opts;

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

    }

我尝试添加迁移但出现此错误

我做错了什么?

我遇到了和你一样的问题。也许它不适用于控制台应用程序,但错误是相同的。所以我认为值得分享我的答案。我使用的是 NET Core 3.0 并且为了解决这个问题,我必须将 IHostBuilder 更改为 IWebHost 并且然后一切都很好。问题出在 class 程序中。

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

问题的快速解决方案是在您的上下文中实现默认构造函数

 public MyContext() : base()
 {
 }

此解决方案的问题是您必须在 'OnConfiguring' 函数中显式输入连接字符串,不推荐这样做

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

请在应用程序设置中检查您的连接字符串,json。

这适用于 ASP 使用 .NET Core 3.1 的 .NET 或 .NET 控制台应用程序。

在我的例子中,它是 ASPNET Core,在将我的应用程序从 2.1 升级到 3.1 后,我遇到了同样的报告问题。 @Matt 提供的答案让我找到了一个可行的解决方案,并允许我继续使用新的 Generic Host。保留 Web 主机只是为了向后兼容。

Generic Host 和 Design-time DbContext Creation 的文档都说明了需要发生的事情。

您的 program.cs 必须有一个 CreateHostBuilder 方法,其签名与记录的完全一致。这是因为框架尝试使用 Program.CreateHostBuilder() 来解析它。签名必须是:

public static IHostBuilder CreateHostBuilder(string[] args)

这就是吸引我的地方,我最初将它命名为 CreateWebHostBuilder,这是一个 2.1 约定;然后我没有定义 args 参数。解决这两个问题立即解决了我的 add-migration ... 错误。

Design-time DbContext Creation 文档非常有帮助,它详细说明了框架如何尝试解决 DbContext 并解释了为什么此处的其他建议会以它们的方式工作,例如无参数构造函数。

就我而言,我的解决方案中有两个启动项目,因此将具有连接字符串的项目设置为唯一的启动项目解决了这个问题

我今天遇到了这个问题。在我的例子中,SqlDbContext 在一个单独的 ASP.Net Core 3.1 class 库项目中,我试图使用 dotnet CLI 从该项目的根文件夹设置迁移。作为默认项目的主 Web 应用程序包含 appsettings.json 中的连接字符串配置和启动配置,因此我必须使用 -s 开关指定启动项目路径,如下所示。

>dotnet ef migrations add initialcreation -s ..\MyWebApp\MyWebApp.csproj

-s,启动项目的缩写,是当 DbContext 与 Web 应用程序项目位于不同项目中时实现 IDesignTimeDbContextFactory 的快速替代方法。

我通过向我的 Context 添加一个普通构造函数解决了这个问题

public class DataContext : DbContext
{
    public DataContext()
    {
    }

    public DataContext(DbContextOptions options) : base(options)
    {
    }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        if (!options.IsConfigured)
        {
            options.UseSqlServer("A FALLBACK CONNECTION STRING");
        }
    }
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);            
    }
}

我是这样解决的:

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

    public MyContext(DbContextOptions options) : base(options) { Database.EnsureCreated(); }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfigurationsFromAssembly(typeof(MyContext).Assembly);
    }

与 NET Core 3.1 有同样的问题。

需要再添加一个构造函数来解决这个问题。 为什么我不知道。

过去从来没有这样做过。

public DataContext()
{            
}

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

确保您已将 DbContext 添加到启动中的服务中 class

在我的案例中,问题是我选择了多个启动项目。选择了一个并修复了