我正在玩MVC 5,我创建了一个使用ASP.NET身份的网站。我按照this blog post on MSDN中的步骤在我的数据库初始化程序的Seed
方法中创建用户和角色。
但是,我注意到该代码中使用的UserManager
和RoleManager
都实现了IDisposable,所以我稍微更改了代码,看起来像这样(并在我完成后配置它们)和他们一起):
protected override void Seed(ApplicationDbContext context)
{
using (var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)))
using (var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)))
{
EnsureRoleCreated(roleManager, Roles.Administrator);
const string AdministratorUserName = "admin";
const string DefaultAdminPassword = "password";
var user = EnsureUserCreated(userManager, AdministratorUserName, DefaultAdminPassword);
EnsureUserIsInRole(userManager, user, Roles.Administrator);
}
base.Seed(context);
}
现在,当我的控制器操作尝试访问数据库时,我得到一个例外,说我的DbContext
已被处理掉。 (我在我的控制器的构造函数中新建了一个DbContext
实例。)
[如果我删除了那些using()
语句,因此不会丢弃UserManager
和RoleManager
,那么问题就会消失,所以它肯定是那些using()
语句有所作为。]
这对我来说似乎很奇怪。如果处理此问题的“正确”方法是不明确处置UserManager
和RoleManager
,那么当垃圾收集器启动时,它们最终仍将被处理掉。由于这是不可预测的,并且可能随时发生,这是否意味着我的应用程序中有定时炸弹?
在我看来,自从我创建了DbContext
之后,我应该负责处理它。为什么UserManager
和/或RoleManager
处理他们没有创建的东西?
答案 0 :(得分:4)
RoleStore
即使没有创建DbContext
,也会处置UserStore
。
DisposeContext
具有DisposeContext
bool属性,用于控制是否应处置上下文。如果使用以DbContext
作为输入的构造函数,则DisposeContext
为false。
这似乎已在nightly builds中得到修复。在这里,RoleStore也具有{{1}}属性,似乎按预期工作。