【问题标题】:Using ApplicationDBContext within a controller for ASP.Net Core MVC在 ASP.Net Core MVC 的控制器中使用 ApplicationDBContext
【发布时间】:2018-05-26 06:27:11
【问题描述】:

我为我的应用程序设置了几个模型,并将它们(使用 DbSet)从 Identity template 添加到 ApplicationDBContext,但现在我不知道如何在控制器内访问上下文本身。

我可以通过依赖注入使用全局上下文吗?每次我提出请求时都必须创建一个新的上下文吗?如果是这样,我可以重复使用 Startup.cs 中的配置吗?

将 ApplicationDBContext 参数添加到我的控制器的构造函数,然后从函数中调用它会产生以下错误:

未处理的异常:System.ObjectDisposedException:无法访问已处置的对象。此错误的一个常见原因是释放从依赖注入中解析的上下文,然后尝试在应用程序的其他地方使用相同的上下文实例。如果您在上下文上调用 Dispose() 或将上下文包装在 using 语句中,则可能会发生这种情况。如果你使用依赖注入,你应该让依赖注入容器来处理上下文实例。`

[Route("[controller]/[action]")]
public class MyController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly ILogger _logger;
    private readonly UrlEncoder _urlEncoder;
    private readonly MyContext _context;

    public MyController(
        UserManager<ApplicationUser> userManager,
        ILogger<ManageController> logger,
        UrlEncoder urlEncoder,
        MyContext context)
    {
        _userManager = userManager;
        _logger = logger;
        _urlEncoder = urlEncoder;
        _context = context;
    }

    [HttpGet]
    public async void Index()
    {
        var user = await _userManager.GetUserAsync(User);
        if (user == null)
        {
            throw new ApplicationException($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
        }
    }

    [HttpPost]
    public async void AMethod(string parameter)
    {
        await _context.MyEntity.AddAsync(parameter);
        await _context.SaveChangesAsync();
    }
}

【问题讨论】:

  • 你能在 Startup 和你的控制器以及你的 DbContext 类中显示你的代码吗?
  • 您是否使用AddDbContext将 ApplicationDbContext 添加到 DI /IoC 容器?
  • Startup.cs 源与this 相同。基本应用程序本身可以工作。我什至尝试按照link 的指南添加另一个上下文。我将编辑我的帖子以包含控制器。
  • "我每次提出请求时都必须创建一个新的上下文吗?"一般来说,如果你正确配置了依赖注入,它会被自动处理,因为AddDbContext使用AddScoped添加它,这在整个请求中都是有效的。
  • 发帖到localhost:5000/MyController/AMethod?parameter=foobar 给了我一个 System.ObjectDisposedException

标签: asp.net-core-mvc


【解决方案1】:

根据这个article,是因为我的函数是async void。我将其更改为async Task,现在它可以工作了._.

【讨论】:

    猜你喜欢
    • 2019-12-03
    • 2018-03-04
    • 2018-05-02
    • 1970-01-01
    • 2019-10-24
    • 2014-07-11
    • 1970-01-01
    • 2020-10-12
    • 2018-06-18
    相关资源
    最近更新 更多