在ASP.Net Core MVC的控制器中使用ApplicationDBContext

时间:2018-05-25 21:23:03

标签: asp.net-core-mvc

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

我是否可以通过依赖注入使用全局上下文?每次提出请求时是否必须创建新的上下文?如果是这样,我可以重用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();
    }
}

1 个答案:

答案 0 :(得分:0)

根据此article,这是因为我的功能是if(message.member.highestRole.comparePositionTo(message.mentions.members.first().highestRole) > 0){ //member has higher role then first mentioned member message.mentions.members.first().ban(); } 。我将其更改为async void,现在可以正常工作._。