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

31
我有一个基于.NET Core的ConsoleApplication,并将我的DbContext添加到了依赖项中,但是我仍然遇到了错误:
无法创建类型为'MyContext'的对象。有关在设计时支持的不同模式,请参见https://go.microsoft.com/fwlink/?linkid=851728 我已经添加了:var context = host.Services.GetRequiredService<MyContext>(); 同时,在我的Post类中,我还添加了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");
        }
    }
}

我尝试使用add-migration命令,但出现了错误

我做错了什么?

20个回答

58
我只需简单地向我的上下文(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);            
    }
}

26

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

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

-s,简称启动项目,是在 DbContext 位于与 Web 应用程序项目不同的项目中时,实现 IDesignTimeDbContextFactory 的快速替代方案。


9
快速解决问题的方法是在你的上下文中实现默认构造函数。
 public MyContext() : base()
 {
 }

这种解决方案的问题在于您必须显式地在“OnConfiguring”函数中输入连接字符串,这是不推荐的。
 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlite("ConnectionString");
        }
 }

4

这不是针对特定问题代码的答案,而是针对错误信息的解答。

可能的解决方法是构造函数的顺序。如果你的 DbContext 有多个构造函数,请确保空构造函数位于顶部。

Not Correctly Ordered DbContext constructors throw error Correctly Ordered DbContext constructors work correctly


1
这正是我的问题,我改变了顺序以确保空的构造函数起作用。 - c-sharp-and-swiftui-devni

4

我曾经遇到过和您一样的问题。也许它不是针对控制台应用程序,但错误却是相同的。所以我认为分享我的答案是值得的。我在使用.NET Core 3.0时,发现必须将IHostBuilder更改为IWebHost才能解决问题,然后一切都正常了。问题出在Program类上。

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

3
在我的情况下,问题是我选择了多个启动项目。只选择一个就解决了问题。

2
请检查您的连接字符串是否在appsetting.json中配置。

2
这适用于使用.NET Core 3.1的ASP .NET或.NET控制台应用程序。
在我的情况下,它是ASPNET Core,我在将应用程序从2.1升级到3.1后遇到了相同的问题。@Matt提供的答案带领我找到了一个可行的解决方案,并允许我继续使用新的通用主机。Web主机仅保留向后兼容性。 通用主机和设计时DbContext创建的文档都说明了需要发生的事情。
您的program.cs必须具有与文档完全相同的CreateHostBuilder方法签名。这是因为框架尝试使用Program.CreateHostBuilder()解析它。签名必须是: public static IHostBuilder CreateHostBuilder(string[] args) 这是让我困惑的地方,我最初将其命名为CreateWebHostBuilder,这是2.1的约定;然后我没有定义args参数。立即解决这两个问题就可以解决我的add-migration ...错误。 设计时DbContext创建文档非常有帮助,详细说明了框架如何解析DbContext并解释了为什么这里的其他建议起作用,例如无参数构造函数。

2

我也遇到了与NET Core 3.1相关的问题。

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

过去从未遇到过这种情况。

public DataContext()
{            
}

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

或者将它们都删除,因为它们什么也不做;-)(EF工具/迁移在幕后使用DI) - Tom

1
在我的.Net 7案例中,问题出现在program.cs文件中。AddDbContext应该在WebApplication.Build()之前添加,而不是之后(这只是一个错误)。 错误的代码:
using var app = builder.Build();

services.AddDbContext<DatabaseContext>(opt => opt
            .UseSqlServer("<Connection-String>"));

正确:

services.AddDbContext<DatabaseContext>(opt => opt
            .UseSqlServer("<Connection-String>"));

using var app = builder.Build();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接