配置 DbContext 构造函数
Posted
技术标签:
【中文标题】配置 DbContext 构造函数【英文标题】:Configuring DbContext Constructor 【发布时间】:2016-12-13 00:18:08 【问题描述】:我正在尝试使用 EF Core 工具来管理我在 C# 类库中设计的 SqlServer 数据库。它在类库中,因为我需要在 MVC6 网站和一些命令行工具中使用数据库模式。
我不得不将类库转换为 netapp,因为当前版本的工具不支持类库,但我认为这不是我的问题的根源。
我的 DbContext 类如下所示:
public class ConnellDbContext : IdentityDbContext<ConnellUser>
public ConnellDbContext( DbContextOptions<ConnellDbContext> options )
// core tables
public DbSet<Ballot> Ballots get; set;
public DbSet<Campaign> Campaigns get; set;
//...
当我在包管理器控制台上运行“dotnet ef 迁移列表”时,我收到以下错误消息:
在“ConnellDbContext”上找不到无参数构造函数。任何一个 将无参数构造函数添加到“ConnellDbContext”或添加 'IDbContextFactory' 的实现 汇编为“ConnellDbContext”。
我不太确定如何解决这个问题。插入无参数构造函数很容易,但是当我这样做时,会出现以下错误:
没有为此 DbContext 配置数据库提供程序。一种 可以通过覆盖 DbContext.OnConfiguring 来配置提供程序 方法或通过在应用程序服务提供者上使用 AddDbContext。 如果使用了 AddDbContext,那么还要确保你的 DbContext 类型 在其构造函数中接受一个 DbContextOptions 对象,并且 将其传递给 DbContext 的基本构造函数。
我 >>认为
"ConnectionStrings":
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-ConnellCampaigns;Trusted_Connection=True;MultipleActiveResultSets=true;AttachDbFilename=e:\\SqlServer\\Data\\ConnellCampaigns.mdf;"
我错过了一些关于 EF 工具如何访问源代码以发挥其魔力的信息。任何指针或线索将不胜感激。
其他信息
感谢安德森先生,我取得了一些进展。我在 DbContext 类中添加了一个无参数构造函数并覆盖了 OnConfiguring() 方法:
protected override void OnConfiguring( DbContextOptionsBuilder optionsBuilder )
var builder = new ConfigurationBuilder()
.AddJsonFile( "appsettings.json", optional: true, reloadOnChange: true );
IConfigurationRoot config = builder.Build();
optionsBuilder.UseSqlServer(config.GetConnectionString("DefaultConnection") );
这不起作用,但在对 UseSqlServer() 的调用中明确包含实际的连接字符串确实有效。关于为什么基于“DefaultConnection”的调用不起作用的想法?
【问题讨论】:
没有这样的魔法。 EF 采用单例模型,每个 T 都有一个 DbContextConnellDbContext
中覆盖 OnConfiguring()
?
不,我没试过。在我理解的范围内,我阅读的文档似乎说提供无参数 ctor 或覆盖 OnConfiguring() 都可以。前者似乎更容易。但我认为我没有正确设置无参数 ctor(此时它只是一个空方法)。
【参考方案1】:
public class ConnellDbContext : IdentityDbContext<ConnellUser>
internal static string connection_string
get
return System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
public ConnellDbContext() : base(connection_string)
// core tables
public DbSet<Ballot> Ballots get; set;
public DbSet<Campaign> Campaigns get; set;
//...
【讨论】:
那么connection_string
从何而来?
@JohnyL 您可以创建从配置中读取连接字符串的属性。让我编辑我的答案。
@JohnyL 现在有意义了吗?
首先,这是 EF Core - 连接字符串必须在 OnConfiguring
方法中使用。其次,忘记第一点,你将如何传递连接字符串?您的 ConnellDbContext
的构造函数没有接收到连接字符串 - 它没有任何东西可以传递给 base
。
@JohnyL 你是对的! .Net Core 是不同的。以上是关于配置 DbContext 构造函数的主要内容,如果未能解决你的问题,请参考以下文章
注入 dbContext 时返回“找不到与给定参数匹配的构造函数”
Entity Framework DbContext 使用错误的构造函数初始化
在构造函数中存储DbSet而不是调用DbContext.Set 适合各种用途
AddDbContext 是通过配置调用的,但是上下文类型“MyContext”只声明了一个无参数的构造函数?