微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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等.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐