当我在数据库初始化程序Seed()中处理UserManager / RoleManager时,为什么我的ApplicationDbContext会被处理掉?

时间:2013-11-30 00:13:12

标签: entity-framework asp.net-mvc-5 asp.net-identity

我正在玩MVC 5,我创建了一个使用ASP.NET身份的网站。我按照this blog post on MSDN中的步骤在我的数据库初始化程序的Seed方法中创建用户和角色。

但是,我注意到该代码中使用的UserManagerRoleManager都实现了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()语句,因此不会丢弃UserManagerRoleManager,那么问题就会消失,所以它肯定是那些using()语句有所作为。]

这对我来说似乎很奇怪。如果处理此问题的“正确”方法是明确处置UserManagerRoleManager,那么当垃圾收集器启动时,它们最终仍将被处理掉。由于这是不可预测的,并且可能随时发生,这是否意味着我的应用程序中有定时炸弹?

在我看来,自从我创建了DbContext之后,我应该负责处理它。为什么UserManager和/或RoleManager处理他们没有创建的东西?

1 个答案:

答案 0 :(得分:4)

RoleStore即使没有创建DbContext,也会处置UserStoreDisposeContext具有DisposeContext bool属性,用于控制是否应处置上下文。如果使用以DbContext作为输入的构造函数,则DisposeContext为false。

这似乎已在nightly builds中得到修复。在这里,RoleStore也具有{{1}}属性,似乎按预期工作。