我是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.cs
和ApplicationUser.cs
,并将它们分别放在Concrete
和Entities
折叠中。
同样在Concrete
foldier中我有EFDbContext.cs
- 与ApplicationDbContext
上下文分开(它们使用相同的数据库连接)。
我想将AppicationDbInitializer
类(来自Project.WebUI\App_Start\IdentityConfig.cs
)存储在Project.Domain
中,因为ApplicationDbContext
包含设置ApplicationDbInitializer
的静态构造函数 ,但后来发现Project.Domain
和Project.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}}方法不起作用?
答案 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);