我目前在ASP.NET 4.5 Web表单项目中实现了现有成员身份。该应用程序使用带有6.1.3
的EntityFramework DbContext
版本,目前采用数据库第一种方法。我想迁移旧成员资格以使用新的ASP.NET身份2.0系统。
我已按照this article执行迁移,但从未成功过。我收到了The property 'Claims' on type 'AspNetUser' is not a navigation property中提到的错误。
它确认我在迁移过程中遗漏了一些基本内容。
有人可以为我提供逐步指导以执行成功迁移吗?
我想谈谈以下几点:
1)在身份方面,我有一些额外的用户数据,而不是默认身份提供的数据。我看到有一个IdentityContext
来执行这些身份操作。我有一个不同的上下文,它继承自DbContext
。我是否需要同时使用这两种情况?换句话说,IdentityContext
是身份操作的必修课吗?这两个上下文不能合并成一个吗?
2)我不限于数据库第一种方法。由于身份使用代码第一种方法,我可以继续使用代码优先方法,但需要正确的步骤来跟进。
3)由于我有额外的用户数据,所以我需要扩展IdentityUser
以添加新属性?如果我将扩展IdentityUser
身份代码将无缝地工作吗?
4)我按照https://www.youtube.com/watch?v=blmkPA7XQf8视频教程添加了ApplicationDbContext
中的迁移。 ApplicationDbContext继承IdentityContext
。它对我有用,但我想为我自己的上下文添加迁移,该上下文继承自DbContext。这是因为ApplicationDbContext不包含其他表(非身份表)。
5)我尝试在我的自定义Context.cs
文件中应用迁移,该文件包含所有身份和非身份表。我按照EntityFramework Power Tools中建议的this article使用逆向工程方法创建了这个类。
创建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'
答案 0 :(得分:1)
1)在身份方面,我有一些额外的用户数据,而不是默认值 身份正在提供。我看到有一个IdentityContext 这些身份操作。我有一个继承的不同上下文 来自DbContext。我是否需要同时使用这两种情况?换一种说法 IdentityContext是身份操作的必要条件吗?不能这两个 上下文合并为一个?
是的,当首先使用Database实现ASP.NET标识时,需要使用两个上下文。由于Asp.Net标识使用System.Data.SqlClient
提供程序,而Edmx使用System.Data.EntityClient
提供程序。
2)我不限于数据库第一种方法。自身份 使用代码第一种方法我可以继续代码优先 方法,但需要正确的步骤来跟进。
很容易在代码第一种方法中实现,甚至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)由于我有额外的用户数据,所以我需要扩展IdentityUser 添加新属性?如果我将扩展IdentityUser将 身份代码无缝地工作?
是的,您可以扩展它。无论何时您想要使用任何其他属性扩展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; }
}
这三点也解决了剩下的问题。