AddDbContext 是通过配置调用的,但是上下文类型“MyContext”只声明了一个无参数的构造函数?

Posted

技术标签:

【中文标题】AddDbContext 是通过配置调用的,但是上下文类型“MyContext”只声明了一个无参数的构造函数?【英文标题】:AddDbContext was called with configuration, but the context type 'MyContext' only declares a parameterless constructor? 【发布时间】:2018-02-07 10:09:22 【问题描述】:

在以下控制台应用程序 (.Net core 2.0) 中,scaffold-dbcontext 创建了以下 DbContext

public partial class MyContext : DbContext

    public virtual DbSet<Tables> Tables  get; set; 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    
        if (!optionsBuilder.IsConfigured)  optionsBuilder.UseSqlServer(Program.Conn); 
    

    protected override void OnModelCreating(ModelBuilder modelBuilder)  .... 

在Main()(static void Main(string[] args))中,如下代码

var services = new ServiceCollection();
var conn = configuration.GetConnectionString("MySource");
services.AddDbContext<MyContext>(o => o.UseSqlServer(conn)); // Error

出现以下运行时错误?

AddDbContext 是通过配置调用的,但上下文类型“MyContext”只声明了一个无参数的构造函数。这意味着传递给 AddDbContext 的配置将永远不会被使用

【问题讨论】:

【参考方案1】:

正如错误所说,如果您通过AddDbContext 配置您的MyContext,那么您还需要将接收DbContextOptions&lt;MyContext&gt; 类型参数的构造函数添加到您的MyContext 类中,如下所示

public MyContext(DbContextOptions<MyContext> options)
    : base(options)
 

如果您不这样做,ASP.Net Core 将无法注入您使用AddDbContext 设置的配置。

【讨论】:

谢谢。我认为不应该更改默认的脚手架代码。但是,现在我有另一个问题 - 我无法获取连接字符串,我在这里发布了一个问题,***.com/questions/45948141/…。 由于连接字符串为空,现在我无法进行最终测试,让我尝试对连接字符串进行硬编码以进行测试....是的,更改有效。谢谢。 注意:这是一个部分类,所以如果你要自动生成上下文,你应该将构造函数添加到第二个文件中 这是为添加到 EF Core 2.0 的新 services.AddDbContextPool() 方法添加的相同构造函数 这个添加让我的代码更进一步。谢谢

以上是关于AddDbContext 是通过配置调用的,但是上下文类型“MyContext”只声明了一个无参数的构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

EFCore之增删改查

wpf 数据库是webapi的项目怎么改为本地调用执行?

AddDbContext 或 AddDbContextPool

在同一个项目中同时使用 AddDbContextFactory() 和 AddDbContext() 扩展方法

将 Dbcontext 配置为瞬态

起订量和设置数据库上下文