Visual Studio 2022中,当DbContext位于一个单独的项目中时,.NET 6脚手架无法正常工作。

4

我正在设置我的第一个.NET 6 MVC网站,但遇到了第一个难关。

我在解决方案中有3个项目: Domain:包含实体 Infrastructure:具有应用程序的DB上下文 WebUi:包含web界面

添加迁移并更新数据库正常工作,但当我尝试搭建控制器时,它会出现错误:

运行所选代码生成器时发生错误:

无法解析服务类型'Microsoft.EntityFrameworkCore.DbContextOptions',尝试激活时出错

然后在另一个类库项目中命名DbContext。

我发现几个月前也有人遇到类似的问题,但除了将所有内容合并到同一项目中之外,没有其他解决方案。

有人遇到过这种情况并找到解决方法吗?


你能否在“基础设施”解决方案上执行“Add-Migration”命令? - Elyas Esna
1
你在Startup.cs中是否已经将DbContext注册到服务提供程序中了? - funatparties
@ElyasEsna:是的,添加迁移并更新数据库可以正常工作。 - jimmy
@funatparties,.NET6没有启动项,但我已经将上下文添加到program.cs中。实际的数据库管道工作(迁移、更新、添加Identity用户)都可以正常运行。只是在尝试脚手架控制器时会出现问题。 - jimmy
2个回答

13
最后我终于找到了适合我的解决方法: 您可以在与您的ApplicationDbContext类相同的文件夹中创建一个DbContext工厂类。这个工厂类可以在设计时创建ApplicationDbContext,从而使脚手架正确运行。
public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
{
        public ApplicationDbContext CreateDbContext(string[] args)
        {
            var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
            optionsBuilder.UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Database=EcommerceDb;Trusted_Connection=True;MultipleActiveResultSets=true");

            return new ApplicationDbContext(optionsBuilder.Options);
        }
}

感谢: https://github.com/dotnet/Scaffolding/issues/1765#issuecomment-1058674843 的贡献。

这对我也起作用了。谢谢你的发布! - Rich-Lang
1
哇,这真是个让人头疼的问题!我花了很多时间寻找解决方案,谢谢!问题在于错误信息在很多其他地方也被使用,所以很难找到这个解决方案,但最终它对我有用了。 - Ricky
对我来说没问题, 当我向我们的团队强调项目模板和脚手架可以节省我们时间时,我遇到了这个错误。 - Jicking
我知道我来晚了,谢谢。这对我来说完美无缺。 - undefined

0

首先确保您在上下文所在的同一项目中拥有正确的软件包。您需要以下内容。

microsoft.aspnetcore.diagnostics.entityframeworkcore microsoft.entityframeworkcore.sqlserver

同时确保在您的上下文中使用硬编码选项生成器连接,而不是像下面这样使用名称参数。只需记得在发布更改之前将其改回即可。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            //optionsBuilder.UseSqlServer
            //("Name=ConnectionStrings:[AppSettingsConnectionName]");
            // Use this OB to scaffold
            optionsBuilder.UseSqlServer
            (@"Data Source=[Server];Initial Catalog=[DBName];");
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接