ASP Identity 2.0和ASP.NET MVC项目结构

时间:2014-11-14 17:55:54

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

我是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 foldier中我有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)的{​​{1}}的类。不幸的是,它会再次产生循环依赖。

我的问题是该怎么做: 如何正确划分项目解决方案并找到Project.WebUI文件? 为什么来自Identity 2.0的{​​{1}}方法不起作用?

1 个答案:

答案 0 :(得分:0)

我认为我们试图做同样的事情困了,我和你在同一条船上。我会用你尝试的东西填写你。

首先,您可以通过将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);