我想从 .net6 升级到 .net8。我必须使用数据库优先方法。 在 .net6 中,我创建了一个自定义上下文,以便能够从注入的配置传递连接字符串。
public partial class ScaffoldedCustomContext : ScaffoldedContext
{
private IConfiguration _config;
public ScaffoldedCustomContext(IConfiguration Configuration)
{
_config = Configuration;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(_config.GetValue<string>("connectionString"));
}
}
}
“切换”到.net8(包升级并更改我的 VS 代码 launch.json)后,数据库脚手架创建以下上下文文件:
public partial class ScaffoldedContext : DbContext
{
public ScaffoldedContext(DbContextOptions<ScaffoldedContext> options)
: base(options)
{
}
...
}
在 .net6 中,我还获得了一个空的默认构造函数:
public ScaffoldedContext()
{
}
在我的一些方法中,例如在“Main”中,我需要创建一个像这样的上下文:
var _context = new ScaffoldedCustomContext(Configuration);
但是使用 .net8 我收到错误消息,指出缺少所需的参数选项。
我该如何应对?我是否需要修改 ScaffoldedCustomContext 还是必须创建一个选项对象 - 如果是,如何?
谢谢你。
可以说你根本不需要
ScaffoldedCustomContext
课程。 ScaffoldedContext
生成为 partial 所以你应该能够创建一个名为 ScaffoldedContext.Custom
之类的文件并将其放置在生成的文件附近(确保将它们放置在同一命名空间中)并将所有自定义内容移至那里:
public partial class ScaffoldedContext
{
private IConfiguration _config;
public ScaffoldedContext(IConfiguration Configuration)
{
_config = Configuration;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(_config.GetValue<string>("connectionString"));
}
}
}
如果没有看到您的
Main
,很难说出最好的行动方案是什么,但是
Main
中的上下文 - 请参阅示例 无法从 ASP.NET Core 6 中的根提供程序解析作用域服务var options = new DbContextOptionsBuilder<ScaffoldedContext>()
.UseSqlServer(Configuration.GetValue<string>("connectionString"))
.Options;
var ctx = new ScaffoldedContext(options);