【发布时间】: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 容器? -
"我每次提出请求时都必须创建一个新的上下文吗?"一般来说,如果你正确配置了依赖注入,它会被自动处理,因为
AddDbContext使用AddScoped添加它,这在整个请求中都是有效的。 -
发帖到localhost:5000/MyController/AMethod?parameter=foobar 给了我一个 System.ObjectDisposedException
标签: asp.net-core-mvc