该表当前具有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 });
更新(一些代码)
IdentityUserRole类:
public class UserRole : IdentityUserRole,IOrganisationEntity { [Key] public int OrganisationId { get; set; } [ForeignKey("OrganisationId")] public Organisation Organisation { get; set; } }
DbContext继承自IdentityDbContext< User>
用户继承自IdentityRebootUser
更新2
这是新的DbContext:
public class MyDbContext : IdentityDbContext<User,Role,string,IdentityUserLogin,UserRole,IdentityUserClaim>
这是我的新用户类:
public class User : IdentityRebootUser<string,IdentityUserClaim>
和角色类:
public class Role : IdentityRole<string,UserRole>
但是,这给了我以下错误:
The type ‘MyNamespace.Model.Entities.User’ cannot be used as type
parameter ‘TUser’ in the generic type or method
‘Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext<TUser,TRole,TKey,TUserLogin,TUserRole,TUserClaim>’.
There is no implicit reference conversion from
‘MyNamespace.Model.Entities.User’ to
‘Microsoft.AspNet.Identity.EntityFramework.IdentityUser<string,Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin,MyNamespace.Model.Entities.UserRole,Microsoft.AspNet.Identity.EntityFramework.IdentityUserClaim>’
更新3
我摆脱了IdentityReboot.我创建了自己的User对象,它具有以下签名:
public class User : IdentityUser<string,IdentityUserClaim>
我现在可以修改UserRole表来添加额外的PK,这就是我想要的.
我现在的问题是,我不能使用默认的UserStore,因为当我告诉它使用我的自定义’User’表时,我收到以下错误:
There is no implicit reference conversion from ‘MyDB.Model.Entities.User’ to ‘Microsoft.AspNet.Identity.EntityFramework.IdentityUser’.
解决方法
基本上,您需要为每个对象创建自己的版本,但从更复杂的版本继承.例如,而不是:
public class ApplicationUser : IdentityUser { ... }
你会这样做:
public class ApplicationUser : IdentityUser<int,CustomUserLogin,CustomUserRole,CustomUserClaim> { ... }
并重复所有对象,包括UserStore,UserManager,RoleManager等.