我已经跟随this article执行迁移,但从未成功.我在The property ‘Claims’ on type ‘AspNetUser’ is not a navigation property提到错误.
它证实我在迁移过程中缺少一些基本的东西.
有人可以提供一步一步的指导来执行成功迁移吗?
我想谈一下以下几点:
1)在身份上,除了默认身份提供之外,我还有一些额外的用户数据.我看到有一个IdentityContext执行这些身份操作.我有一个不同的上下文继承自DbContext.我需要同时使用上下文吗?换句话说,IdentityContext是强制身份操作的?这两个上下文不能合并成一个吗?
2)我不限于数据库的第一种方法.由于身份使用代码第一种方法,我可以继续执行代码优先方法,但需要正确的步骤来跟进.
3)由于我有额外的用户数据,所以我需要扩展IdentityUser以添加新的属性?如果我将扩展IdentityUser,身份代码将无缝工作?
4)我遵循@L_403_2@视频教程,它在ApplicationDbContext中添加了迁移. ApplicationDbContext继承IdentityContext.它适用于我,但我想为我自己的上下文添加迁移,该继承自DbContext.这是因为ApplicationDbContext不包括其他表(非身份表).
5)我尝试在我的自定义Context.cs文件中应用迁移,其中包含所有身份和非身份表.我在this article建议的时候使用EntityFramework Power Tools的反向工程方法创建了这个类.
在创建POCO类之后,我添加了迁移并更新了数据库.我遇到的主要错误是:
IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' is based on type 'IdentityUserLogin' that has no keys defined. IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no keys defined.
根据此解决方案,我添加了配置,但最终创建了IdentityUserLogin,IdentityRole等新表,这些表是重复的身份表.
6)即使我保留重复的身份表(例如AspNetUserRoles和IdentityUserRole),我无法使用身份代码提取数据
var user = userManager.FindAsync(UserName.Text,Password.Text);并获得例外:
Invalid column name 'UserId'
解决方法
1) In identity,I have some extra user data other than what default
identity is providing. I see there is a IdentityContext which does
these identity operations. I have a different context which inherits
from DbContext. Do I need to use both the contexts? In other words
IdentityContext is compulsory for identity operation? Cannot these two
contexts be merged into one?
是的,首先使用数据库实现ASP.NET标识时,需要使用两个上下文. Asp.net身份使用System.Data.sqlClient提供者,而Edmx使用System.Data.EntityClientprovider.
2) I’m not restricted to Database first approach. Since the identity
uses the code first approach I am okay to go ahead with the code-first
approach but needs the correct steps to follow up.
ASP.NET MVC默认模板在代码优先方法中很容易实现,它提供了使用代码第一种方法实现ASp.NET标识,但并不是数据库第一种方法的问题.
https://danieleagle.com/2014/05/setting-up-asp-net-identity-framework-2-0-with-database-first-vs2013-update-2-spa-template/
3) Since I have extra user data so I need to extend the IdentityUser
to add new properties? If I will extend the IdentityUser will the
identity code work seamlessly?
是的,您可以扩展它.只要您想使用任何其他属性来扩展User.Identity的属性,首先将这些属性添加到ApplicationUser类中:
public class ApplicationUser : IdentityUser { public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) { // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType var userIdentity = await manager.CreateIdentityAsync(this,DefaultAuthenticationTypes.ApplicationCookie); // Add custom user claims here return userIdentity; } //Extended properties public string City { get; set; } }
这三点也解决了余下的问题.