entity-framework – 自定义IdentityUserRole主键

我正在使用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>

用户继承自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’.

所以我实现了自己的IUserStore版本,它正在生成异步错误.

如果只有一种方法可以将UserStore与我的自定义User对象一起使用,我会非常高兴.

解决方法

您需要自定义所有标识对象以指定不同的密钥.网上有各种教程,但我发现最好的是 www.asp.net.

基本上,您需要为每个对象创建自己的版本,但从更复杂的版本继承.例如,而不是:

public class ApplicationUser : IdentityUser
{
    ...
}

你会这样做:

public class ApplicationUser : IdentityUser<int,CustomUserLogin,CustomUserRole,CustomUserClaim> 
{ 
    ...
}

并重复所有对象,包括UserStore,UserManager,RoleManager等.

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....