我是ASP.NET MVC5
的初学者。
我的项目解决方案具有 MVC5 Pro 中所述 ASP.NET 结构:
Solution
-Project.Domain --- C# Class Library
-Project.WebUI --- Empty ASP.Net MVC Project Template
-Project.UnitTests
我想在其中使用ASP Identity 2.0
。
在Project.Domain中,我有Concrete
(上下文,它们的初始值设定项)和Entities
(数据模型)折叠器。
我按照此处所述安装了Identity 2.0 Samples
。
我将IdentityModels.cs
文件分成ApplicationDbContext.cs
和ApplicationUser.cs
,并分别将它们放入Concrete
和Entities
折叠器中。
同样在折叠器Concrete
我有EFDbContext.cs
- 与ApplicationDbContext
上下文分开(它们使用相同的数据库连接)。
我想将AppicationDbInitializer
类(来自 Project.WebUIApp_StartIdentityConfig.cs
)存储在 Project.Domain
中ApplicationDbContext
,因为它包含设置ApplicationDbInitializer
的静态构造函数,但后来发现 Project.Domain
和 Project.WebUI
具有循环依赖性,所以我决定不移动它并从 Project.WebUI
Global.asax.cs
设置数据库初始值设定项。
然后问题开始了。由于某些原因,方法 ApplicationDbInitializer.Seed
不起作用,并且未创建role "Admin"
。然后我决定尝试启用迁移。我在 Project.Domain
中启用了迁移(如此处所述),为了实现Seed
我需要从IdentityConfig.cs (ApplicationUserManager and ApplicationRoleManager)
访问来自Project.WebUI
的类。不幸的是,它将再次产生循环依赖。
我的问题是该怎么做:如何正确地划分项目解决方案并找到Identity 2.0
文件?为什么Seed
方法从ApplicationDbInitilizer
不起作用?
我想我们正在尝试做完全相同的事情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,但不确定这有多好。 但至少让我更进一步。
将标识 2.0 函数移动到存储库类
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);