运行所选代码生成器时出错:无法解析类型“Microsoft.EntityFrameworkCore.DbContextOption”的服务

Gop*_*rma 14 asp.net-core-webapi entity-framework-6.4 .net-6.0 visual-studio-2022

我正在使用 Visual Studio 2022 Preview 和 .NET 6 SDK。

这里我创建了一个有 2 层的 webAPI 项目。api项目(Bgvsystem.webAPI)类库(BgvSystem.Persistance)

NuGet 包-

安装包 Microsoft.EntityFrameworkCore.SqlServer -版本 6.0.0-rc.1.21452.10

安装包 Microsoft.EntityFrameworkCore.Tools -版本 6.0.0-rc.1.21452.10

安装包 Microsoft.VisualStudio.Web.CodeGeneration.Design -版本 6.0.0-rc.1.21464.1

当我尝试使用脚手架添加控制器时,出现以下错误

There was an error running the selected code generator: unable to resolve service for type 'microsoft.entityframeworkcore.dbcontextoption.. While attempting to activate Dbcontext in  .net 6 and visual studio 2022 preview
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如何解决这个问题?请帮忙解决这个问题。

Sim*_*ant 18

您可以在与 ApplicationDbContext 类相同的文件夹中创建 dbcontext 工厂类。该工厂类在设计时创建 ApplicationDbContext 并且脚手架正确运行。

来源: https: //github.com/dotnet/Scaffolding/issues/1765

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案为我解决了这个问题,而其他人则没有。+1 (4认同)

小智 6

您可以在与您的类相同的文件夹中创建一个dbcontext工厂类ApplicationDbContext。该工厂类ApplicationDbContext在设计时创建并且脚手架正确运行。

public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
{
        public ApplicationDbContext CreateDbContext(string[] args)
        {
            var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
            optionsBuilder.UseSqlServer("Server=YourServer; Database=YourDb; Integrated Security=true; MultipleActiveResultSets=true; Trusted_Connection=True");

            return new ApplicationDbContext(optionsBuilder.Options);
        }
}
Run Code Online (Sandbox Code Playgroud)


Gop*_*rma 5

经过三天的努力,终于找到了错误并修复了。

实际上我必须将连接字符串放入 MyApp.Persistance.DbContextClass 中,如下所示

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer("Data Source=DESKTOP-SV8GPJ2\\SQLEXPRESS;Initial Catalog=StarterAppDB;Persist Security Info=True;User ID=sa;Password=Admin@1234");
            }
        }
Run Code Online (Sandbox Code Playgroud)

然后效果很好。