Duk*_*hoo 11 c# asp.net entity-framework asp.net-membership asp.net-identity-2
我目前在ASP.NET 4.5 Web表单项目中实现了现有成员身份.该应用程序使用EntityFramework 6.1.3版本,DbContext当前采用数据库第一种方法.我想迁移旧成员资格以使用新的ASP.NET身份2.0系统.
我已经按照本文执行迁移但从未成功过.我收到了'AspNetUser'类型的属性'Claims'中提到的错误不是导航属性.
它证实了我在迁移过程中遗漏了一些基本内容.
有人可以为我提供逐步指导以执行成功迁移吗?
我想谈谈以下几点:
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的逆向工程方法创建了这个类,如本文所述.
创建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.
Run Code Online (Sandbox Code Playgroud)
根据这个解决方案,我添加了配置,但最终为IdentityUserLogin,IdentityRole等创建了新表,这些表是重复的身份表.
6)即使我保留了重复的身份表(例如AspNetUserRoles和IdentityUserRole),我也无法使用身份代码获取数据
var user = userManager.FindAsync(UserName.Text, Password.Text);并获得异常:
Invalid column name 'UserId'
Run Code Online (Sandbox Code Playgroud)
1)在身份方面,除了默认身份提供的数据之外,我还有一些额外的用户数据。我看到有一个 IdentityContext 执行这些身份操作。我有一个继承自 DbContext 的不同上下文。我需要使用这两个上下文吗?换句话说,IdentityContext对于身份操作是必需的?这两个上下文不能合二为一吗?
是的,当首先使用数据库实现 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; }
}
Run Code Online (Sandbox Code Playgroud)
这三点也解决了剩下的问题。