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

时间:2019-09-01 11:09:53

标签: c# entity-framework sqlite .net-core datacontext

我在.NET Core上具有ConsoleApplication,并且我已将DbContext添加到依赖项中,但是我却出错了:

  

无法创建类型为“ MyContext”的对象。有关设计时支持的不同模式,请参见https://go.microsoft.com/fwlink/?linkid=851728

我添加了:var context = host.Services.GetRequiredService<MyContext>(); 另外,我在我的帖子类别中添加了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并出现此错误

我做错了什么?

10 个答案:

答案 0 :(得分:3)

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

 public MyContext() : base()
 {
 }

此解决方案的问题在于,您将不得不在“ OnConfiguring”函数中明确输入连接字符串,不建议这样做

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

答案 1 :(得分:3)

我今天遇到了这个问题。就我而言,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的快速替代方案。

答案 2 :(得分:2)

我和你有同样的问题。也许不是控制台应用程序,但错误是相同的。因此,我认为值得与我的答案分享。我使用的是 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中检查您的连接字符串。

答案 4 :(得分:2)

我通过在上下文中添加一个普通的构造函数来解决了这个问题

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

答案 5 :(得分:0)

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

在我的情况下是ASPNET Core,将应用程序从2.1升级到3.1后,我遇到了同样的报告问题。 @Matt提供的答案将我引向一个可行的解决方案,并使我可以继续使用新的Generic Host。 Web Host仅保留用于向后兼容。

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的原因,并解释了此处的其他建议为何按其工作方式工作,例如无参数构造函数。

答案 6 :(得分:0)

对于我来说,我的解决方案中有两个启动项目,因此将具有连接字符串的项目设置为唯一的启动项目即可解决问题

答案 7 :(得分:0)

我通过这种方式解决了这个问题:

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

答案 8 :(得分:0)

NET Core 3.1也有同样的问题。

需要再添加一个构造函数。 为什么我不知道。

过去从来没有这样做。

public DataContext()
{            
}

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

答案 9 :(得分:0)

确保您已将 DbContext 添加到 Startup 类中的服务