.NET 6 ...无法解析类型的服务

.NET 6 ... unable to resolve service for type

我在 VS 2022 中使用 NuGet 包:

Microsoft.EntityFrameworkCore.SQLServer Microsoft.EntityFrameworkCore.Tools

连接到我的 SQL 服务器(一切正常),我的所有模型部分 classes 已生成。我添加了一个新控制器(添加新脚手架项)和 select“带视图的 MVC 控制器,使用 Entity Framework”。 Select 我的模型 class “Phonenumbertype” 我的数据上下文 class “JMSContext”(只是 web API 没有通过 Swagger 测试的前端)。我的控制器生成

namespace WebAppTest.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class PhonenumbertypesController : ControllerBase
    {

    // Error out with code generated:
    // https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-6.0
    // https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-6.0

    // Possible Solution
    // 

    private readonly JMSContext _context;

    public PhonenumbertypesController(JMSContext context)
    {
        _context = context;
    }

    // GET: api/Phonenumbertypes
    [HttpGet]
    public async Task<ActionResult<IEnumerable<Phonenumbertype>>> GetPhonenumbertypes()
    {
        return await _context.Phonenumbertypes.ToListAsync();
    }

    // GET: api/Phonenumbertypes/5
    [HttpGet("{id}")]
    public async Task<ActionResult<Phonenumbertype>> GetPhonenumbertype(short id)
    {
        var phonenumbertype = await _context.Phonenumbertypes.FindAsync(id);

        if (phonenumbertype == null)
        {
            return NotFound();
        }

        return phonenumbertype;
    }

    // PUT: api/Phonenumbertypes/5
    // To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
    [HttpPut("{id}")]
    public async Task<IActionResult> PutPhonenumbertype(short id, Phonenumbertype phonenumbertype)
    {
        if (id != phonenumbertype.PhtId)
        {
            return BadRequest();
        }

        _context.Entry(phonenumbertype).State = EntityState.Modified;

        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!PhonenumbertypeExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return NoContent();
    }

    // POST: api/Phonenumbertypes
    // To protect from overposting attacks, see https://go.microsoft.com/fwlink/?linkid=2123754
    [HttpPost]
    public async Task<ActionResult<Phonenumbertype>> PostPhonenumbertype(Phonenumbertype phonenumbertype)
    {
        _context.Phonenumbertypes.Add(phonenumbertype);
        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateException)
        {
            if (PhonenumbertypeExists(phonenumbertype.PhtId))
            {
                return Conflict();
            }
            else
            {
                throw;
            }
        }

        return CreatedAtAction("GetPhonenumbertype", new { id = phonenumbertype.PhtId }, phonenumbertype);
    }

    // DELETE: api/Phonenumbertypes/5
    [HttpDelete("{id}")]
    public async Task<IActionResult> DeletePhonenumbertype(short id)
    {
        var phonenumbertype = await _context.Phonenumbertypes.FindAsync(id);
        if (phonenumbertype == null)
        {
            return NotFound();
        }

        _context.Phonenumbertypes.Remove(phonenumbertype);
        await _context.SaveChangesAsync();

        return NoContent();
    }

    private bool PhonenumbertypeExists(short id)
    {
        return _context.Phonenumbertypes.Any(e => e.PhtId == id);
    }
   }
}

I 运行 my web API,Swagger 启动,select my API(试用)并得到错误:响应状态为 500 和以下正文:

System.InvalidOperationException:尝试激活 'WebAppTest.Controllers.PhonenumbertypesController' 时无法解析类型 'WebAppTest.Models.JMSContext' 的服务。 在 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,Type type,Type requiredBy,Boolean isDefaultParameterRequired) 在 lambda_method9(Closure , IServiceProvider , Object[] ).....

这都是自动生成的代码,所以我的期望是它会起作用,我会从那里扩展我的代码...这只是一个基本测试。

通过删除控制器中所有自动生成的代码,它能够得到我想要的结果 class ...但是,我想弄清楚为什么自动生成的代码没有工作?

您需要像 this 一样解析 startup.cs class 中的 JMSContext class。 更多关于 Dependency injection in .NET

自动生成的代码假定您已经安装了依赖项注册。在你的情况下,你还没有添加 JMSContext 到依赖容器。

您需要将 JMSContext 添加到 DI

如果你使用的是启动文件,那么你可以

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<JMSContext>(options => options.UseSqlServer(Configuration.GetConnectionString("YourConnectionStringKeyName_From_AppSettings.json"));
    //----- rest of the code
}

如果您没有使用启动文件,那么在您的 Program.cs 文件中,在构建应用程序之前,您可以使用

builder.Services.AddDbContext<JMSContext>(options => options.UseSqlServer(Configuration.GetConnectionString("YourConnectionStringKeyName_From_AppSettings.json"));