我为我的应用程序设置了几个模型,并将它们(使用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();
}
}
答案 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
,现在可以正常工作._。