c# – ASP.NET MVC 5页面在db调用时挂起
发布时间:2020-12-15 19:57:48 所属栏目:百科 来源:网络整理
导读:我正在尝试使用ASP.NET Identity 2.0启动并运行MVC 5项目.我的出发点是 this tutorial中的示例应用程序.我的初始页面是Home / Index.当我尝试进行搜索(期望返回值为null)时,应用程序只会挂起,我无法弄清楚原因. db上下文的实例化导致调用Seed()方法,这似乎正
我正在尝试使用ASP.NET Identity 2.0启动并运行MVC 5项目.我的出发点是
this tutorial中的示例应用程序.我的初始页面是Home / Index.当我尝试进行搜索(期望返回值为null)时,应用程序只会挂起,我无法弄清楚原因. db上下文的实例化导致调用Seed()方法,这似乎正常,但它挂起在roleManager.FindByName(roleName)调用上(我在下面的代码中对它进行了评论).暂停调试器显示它被卡住但我不知道从那里去哪里.相关课程如下.
控制器: public class HomeController : ApplicationController { public ActionResult Index() { var user = db.Users.Find("dummyVal"); return View(); } [Authorize] public ActionResult About() { ViewBag.Message = "Your app description page."; return View(); } public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } } 基础控制器: public abstract class ApplicationController : Controller { protected ApplicationDbContext db; public ApplicationController() { db = new ApplicationDbContext(); } } DB初始化器: public class ApplicationDbInitializer : DropCreateDatabaseAlways<ApplicationDbContext> { protected override void Seed(ApplicationDbContext context) { InitializeIdentityForEF(context); base.Seed(context); } //Create User=Admin@Admin.com with password=Admin@123456 in the Admin role public static void InitializeIdentityForEF(ApplicationDbContext db) { var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>(); const string name = "admin@example.com"; const string password = "Admin@123456"; const string roleName = "Admin"; //Create Role Admin if it does not exist // EXECUTION HANGS ON THIS CALL... var role = roleManager.FindByName(roleName); if (role == null) { role = new IdentityRole(roleName); var roleresult = roleManager.Create(role); } var user = userManager.FindByName(name); if (user == null) { user = new ApplicationUser { UserName = name,Email = name }; var result = userManager.Create(user,password); result = userManager.SetLockoutEnabled(user.Id,false); } // Add user admin to Role Admin if not already added var rolesForUser = userManager.GetRoles(user.Id); if (!rolesForUser.Contains(role.Name)) { var result = userManager.AddToRole(user.Id,role.Name); } // Create dummy user const string dummyUserName = "PeterVenkman"; const string dummyUserPwd = "gf%^^ftf83X"; var dummyUser = userManager.FindByName(dummyUserName); if (dummyUser == null) { dummyUser = new ApplicationUser { UserName = dummyUserName,Email = dummyUserName }; var result = userManager.Create(dummyUser,dummyUserPwd); result = userManager.SetLockoutEnabled(dummyUser.Id,false); } } } 解决方法
该错误是因为您在控制器中实例化dbContext对象而不是从owin上下文中获取它.控制器中存在两个不同的上下文对象,而同一个数据库中的一个启动工作正在导致此死锁.解决此问题的最简单方法是替换代码
db = new ApplicationDbContext(); 同 db = System.Web.HttpContext.Current.GetOwinContext().Get<ApplicationDbContext>(); 解决了这个问题 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |