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<MyContext>
类型参数的构造函数添加到您的MyContext
类中,如下所示
public MyContext(DbContextOptions<MyContext> options)
: base(options)
如果您不这样做,ASP.Net Core 将无法注入您使用AddDbContext
设置的配置。
【讨论】:
谢谢。我认为不应该更改默认的脚手架代码。但是,现在我有另一个问题 - 我无法获取连接字符串,我在这里发布了一个问题,***.com/questions/45948141/…。 由于连接字符串为空,现在我无法进行最终测试,让我尝试对连接字符串进行硬编码以进行测试....是的,更改有效。谢谢。 注意:这是一个部分类,所以如果你要自动生成上下文,你应该将构造函数添加到第二个文件中 这是为添加到EF Core 2.0
的新 services.AddDbContextPool()
方法添加的相同构造函数
这个添加让我的代码更进一步。谢谢以上是关于AddDbContext 是通过配置调用的,但是上下文类型“MyContext”只声明了一个无参数的构造函数?的主要内容,如果未能解决你的问题,请参考以下文章
AddDbContext 或 AddDbContextPool