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

Tai*_*nov 16 c# sqlite datacontext entity-framework .net-core

我在 .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();
 }
Run Code Online (Sandbox Code Playgroud)

这是我添加服务的方式:

.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));
Run Code Online (Sandbox Code Playgroud)

这是我的上下文:

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

    }
Run Code Online (Sandbox Code Playgroud)

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

我做错了什么?

Ste*_*eve 14

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

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);            
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

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

>dotnet ef migrations add initialcreation -s ..\MyWebApp\MyWebApp.csproj
Run Code Online (Sandbox Code Playgroud)

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


Pro*_*eus 5

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

 public MyContext() : base()
 {
 }
Run Code Online (Sandbox Code Playgroud)

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

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlite("ConnectionString");
        }
 }
Run Code Online (Sandbox Code Playgroud)


Adn*_*nan 5

这不是此特定问题代码的答案,而是错误消息的答案。

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

顺序不正确的 DbContext 构造函数抛出错误 正确排序的 DbContext 构造函数可以正常工作