gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:38:54 25 4
gpt4 key购买 nike

我正在使用 MVC 5,并且创建了一个使用 ASP.NET Identity 的网站。我按照 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);
}

现在,当我的 Controller 操作尝试访问数据库时,我收到一个异常,提示我的 DbContext 已被释放。 (我在 Controller 的构造函数中新建了一个 DbContext 实例)。

[如果我删除那些 using() 语句,从而不处理 UserManagerRoleManager,那么问题就消失了,所以绝对是那些 using() 语句在起作用。]

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

在我看来,既然我创建了 DbContext,我就应该负责处理它。为什么 UserManager 和/或 RoleManager 处理不是他们创建的东西?

最佳答案

RoleStore 处理 DbContext,即使它没有创建它。UserStore 有一个 DisposeContext bool 属性,它控制上下文是否应该被释放。如果您使用将 DbContext 作为输入的构造函数,则 DisposeContext 为 false。

这似乎已在 nightly builds 中修复.这里的 RoleStore 也有 DisposeContext 属性并且似乎按预期工作。

关于entity-framework - 当我在数据库初始化程序 Seed() 中处理 UserManager/RoleManager 时,为什么我的 ApplicationDbContext 会被处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20295022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com