【问题标题】:ASP Identity 2.0 and ASP.NET MVC Project StructureASP Identity 2.0 和 ASP.NET MVC 项目结构
【发布时间】:2014-11-17 05:39:48
【问题描述】:

我是ASP.NET MVC5的初学者。

我的项目解决方案具有ASP.NET MVC5 Pro中描述的结构:

Solution
 -Project.Domain    --- C# Class Library
 -Project.WebUI     --- Empty ASP.Net MVC Project Template
 -Project.UnitTests

我想在其中使用ASP Identity 2.0

在 Project.Domain 中,我有 Concrete(上下文,它们的初始化程序)和 Entities(数据模型)文件夹。

我按照here 的描述安装了Identity 2.0 Samples

我将IdentityModels.cs文件拆分为ApplicationDbContext.csApplicationUser.cs,分别放在ConcreteEntities文件夹中。

同样在Concrete 文件夹中我有EFDbContext.cs - 与ApplicationDbContext 上下文分开(它们使用相同的数据库连接)。

我想将AppicationDbInitializer 类(来自Project.WebUI\App_Start\IdentityConfig.cs)存储在Project.Domain 中,因为ApplicationDbContext 包含设置ApplicationDbInitializer静态构造函数,但后来发现Project.DomainProject.WebUI循环依赖,所以我决定不移动它并在Global.asax.cs 中从Project.WebUI 设置数据库初始化程序。

然后问题开始了。由于某些原因,方法 ApplicationDbInitializer.Seed 不起作用并且 role "Admin" 未创建。 然后我决定尝试启用迁移。我在Project.Domain 中启用了迁移(如here 所述),为了实现Seed,我需要从IdentityConfig.cs (ApplicationUserManager and ApplicationRoleManager) 访问来自Project.WebUI 的类。不幸的是,它又会造成循环依赖。

我的问题是该怎么做: 如何正确划分项目的解决方案并找到Identity 2.0 文件? 为什么ApplicationDbInitilizer 中的Seed 方法不起作用?

【问题讨论】:

    标签: c# asp.net-mvc-5 migration asp.net-identity projects-and-solutions


    【解决方案1】:

    我认为我们正在尝试做完全相同的事情 Sleepy,我和你在同一条船上。我会告诉你我尝试过的内容。

    首先,您可以通过将 ApplicationDbInitializer 移动到 Application_Start 方法并调用 Database.SetInitializer 来修复循环依赖。

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
        }
    

    这使您可以将 ApplicationDbContext 和 ApplicationUser 保留在域中,同时将 ApplicationDbInitializer 保留在 WebUI 项目中。

    其次,我读过之前的一篇文章,说不使用 GetOwinContext 方法来获取 userManager 和 roleManager,但不确定这个想法有多好。但至少这让我更进一步。

    Moving Identity 2.0 functions to repository class

        public static void InitializeIdentityForEf(ApplicationDbContext context) {
            // var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
            // var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>();
    
            // Since we needed to move this class into the Domain namespace, we have to do the Owin differently
    
            var roleStore = new RoleStore<IdentityRole>(context);
            var roleManager = new RoleManager<IdentityRole>(roleStore);
            var userStore = new UserStore<ApplicationUser>(context);
            var userManager = new UserManager<ApplicationUser>(userStore);
    

    当我执行“更新数据库”时,种子没有填充,但当我运行网站并尝试注册用户时,它确实会尝试运行。但我得到一个错误

    Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
    

    在这条线上

    var result = await UserManager.CreateAsync(user, model.Password);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多