我正在使用ASP.NET身份提供程序和EF 6 Code First,我创建了一个自定义IdentityUserRole
表,其中有一个额外的列OrganisationId
。自定义表名为UserRole。
该表目前的默认主键为UserId
和RoleId
。
我想将OrganisationId列包含在IdentityUserRole表的主键中。
我可以在我的数据库中看到UserRole表,它是用于用户用户的表(当我为用户分配角色时,没有aspnet_userrole表,表有数据)
我试过了:
modelBuilder.Entity<IdentityUserRole>().ToTable("UserRole").HasKey(x => new { x.UserId, x.RoleId });
但它没有向我显示OrganisationId属性。
所以我试过了:
modelBuilder.Entity<UserRole>().HasKey(x => new { x.OrganisationId, x.RoleId, x.UserId });
但是当我添加迁移时,Up和Down方法都是空的。
更新(部分代码)
IdentityUserRole类:
public class UserRole : IdentityUserRole, IOrganisationEntity
{
[Key]
public int OrganisationId { get; set; }
[ForeignKey("OrganisationId")]
public Organisation Organisation { get; set; }
}
DbContext继承自IdentityDbContext<User>
User
继承自IdentityRebootUser
更新2
这是新的DbContext:
public class MyDbContext : IdentityDbContext<User, Role, string,
IdentityUserLogin, UserRole, IdentityUserClaim>
这是我的新用户类:
public class User : IdentityRebootUser<string, IdentityUserLogin,
Role, IdentityUserClaim>
角色类:
public class Role : IdentityRole<string, UserRole>
然而,这给了我以下错误:
“MyNamespace.Model.Entities.User”类型不能用作类型 泛型类型或方法中的参数'TUser' 'Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext&lt; TUser,TRole,TKey,TUserLogin,TUserRole,TUserClaim&gt;'。 没有隐式引用转换 'MyNamespace.Model.Entities.User'到 'Microsoft.AspNet.Identity.EntityFramework.IdentityUser&lt; string,Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin,MyNamespace.Model.Entities.UserRole,Microsoft.AspNet.Identity.EntityFramework.IdentityUserClaim&gt;'
更新3
我摆脱了IdentityReboot。我创建了自己的User对象,它具有以下签名:
public class User : IdentityUser<string, IdentityUserLogin,
UserRole, IdentityUserClaim>
我现在可以修改UserRole表来添加额外的PK,这就是我想要的。
我现在遇到的问题是,我无法使用默认的UserStore,因为当我告诉它使用我的自定义'User'表时,我收到以下错误:
没有从'MyDB.Model.Entities.User'到'Microsoft.AspNet.Identity.EntityFramework.IdentityUser'的隐式引用转换。
所以我实现了自己的IUserStore版本,它正在生成异步错误。
如果只有一种方法可以将UserStore与我的自定义User对象一起使用,我会非常高兴。
答案 0 :(得分:7)
您需要自定义所有标识对象以指定不同的密钥。网上有各种教程,但我发现的最好的是www.asp.net。
基本上你需要制作自己的每个对象版本,但是从更复杂的版本继承。例如,而不是:
public class ApplicationUser : IdentityUser
{
...
}
你会这样做:
public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole,
CustomUserClaim>
{
...
}
并重复所有对象,包括UserStore,UserManager,RoleManager等。