正在配置DbContext构造函数
本文关键字:构造函数 DbContext 配置 | 更新日期: 2023-09-27 18:01:12
我正在尝试使用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; }
//...
}
当我在Package Manager控制台上运行"dotnet ef migrations list"时,我会收到以下错误消息:
在"ConnellDbContext"上找不到无参数构造函数。任何一个向"ConnellDbContext"添加无参数构造函数或添加在程序集为"ConnellDbContext"。
我不太确定如何解决这个问题。插入一个无参数构造函数很容易,但当我这样做时,我会得到以下错误:
尚未为此DbContext配置任何数据库提供程序。A.提供程序可以通过重写DbContext.OnConfiguration方法,或者在应用程序服务提供程序上使用AddDbContext。如果使用了AddDbContext,那么也要确保您的DbContext类型在其构造函数中接受DbContextOptions对象,并且将其传递给DbContext的基构造函数。
我>>认为<lt;这意味着控制台命令没有在我的appsettings.json文件中获取连接字符串信息:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)''mssqllocaldb;Database=aspnet-ConnellCampaigns;Trusted_Connection=True;MultipleActiveResultSets=true;AttachDbFilename=e:''SqlServer''Data''ConnellCampaigns.mdf;"
}
}
我遗漏了一些关于EF工具如何访问源代码以发挥其魔力的内容。任何指示或线索都将不胜感激。
附加信息
感谢Anderson先生,我取得了一些进步。我在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"的呼叫不起作用?
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; }
//...
}