我正在扩展IdentityUserRole以具有另一个称为WorkspaceId的主键/外键Id字段。
我收到此错误:"'应用程序用户角色'不能在属性'WorkspaceId'上具有键属性,因为主键只能在根类型上声明">
这是我的应用程序用户角色类:
public partial class ApplicationUserRole: IdentityUserRole<string>
{
[Key, ForeignKey("WorkspaceId")]
public string WorkspaceId { get; set; }
public virtual Workspace Workspace { get; set; }
}
在 DbContext 中,我正在做:
modelBuilder.Entity<ApplicationUserRole>(entity =>
{
entity.HasKey(k => new { k.RoleId, k.WorkspaceId, k.UserId });
entity.HasOne(r => r.Workspace).WithMany();
});
向我的 UserRoles 表添加主键的最佳方法是什么,或者,只创建另一个表更好、更安全?对我来说,拥有另一个包含来自 IdentityUserRole 和 WorkspaceId PK/FK 的 PK/FK 的表似乎有点矫枉过正。这意味着我需要维护两个表。
另外,我正在使用.net Core 1.1
更新 1
在审查和实施调查结果时:这里和这里
迁移时出现以下错误:
'Models.ApplicationUser', on 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore'4[TUser,TRole,TContext,TKey]' 违反了类型'TUser'的约束
这是我的应用程序用户
public class ApplicationUser : IdentityUser<string, ApplicationUserClaim, ApplicationUserRole, ApplicationUserLogin>
这是我的用户存储:
public class ApplicationUserStore : UserStore<ApplicationUser, ApplicationRole, ApplicationDbContext, string, ApplicationUserClaim, ApplicationUserRole, ApplicationUserLogin, ApplicationUserToken, ApplicationRoleClaim>
这是我在启动中的代码:
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext, string>()
.AddDefaultTokenProviders()
.AddUserStore<ApplicationUserStore>()
.AddRoleStore<ApplicationRoleStore>();
services.AddScoped<UserStore<ApplicationUser, ApplicationRole, AsherDbContext, string, ApplicationUserClaim, ApplicationUserRole, ApplicationUserLogin, ApplicationUserToken, ApplicationRoleClaim>, ApplicationUserStore>();
services.AddScoped<RoleManager<ApplicationRole>>();
services.AddScoped<SignInManager<ApplicationUser>>();
以下是我的身份模型:
public class ApplicationUserRole : IdentityUserRole<string>
public class ApplicationUserClaim : IdentityUserClaim<string>
public class ApplicationUserLogin : IdentityUserLogin<string>
public class ApplicationRoleClaim : IdentityRoleClaim<string>
public class ApplicationUserToken : IdentityUserToken<string>
public class ApplicationRole : IdentityRole<string, ApplicationUserRole, ApplicationRoleClaim>
更新 2删除以下行修复了约束冲突错误:
.AddEntityFrameworkStores<AsherDbContext, string>()
ApplicationUserRole 派生自模型中已包含的 IdentityUserRole,因此需要在其上配置密钥,因为它是基类。默认情况下,IdentityDbContext 将其密钥配置为 {UserId, RoleId}。
这里回答了同样的问题:
自定义标识用户角色主键