好的,因为我花了几个小时来寻找解决方案,所以我将它发布在这里,如果它可以帮助其他人。
首先,在AspNetRoles 中,创建您的自定义列AND 名为Discriminator 的列(即nvarchar(max))。更新你的.edmx
然后,我们必须创建一个继承自IdentityRole 的类。我们将使用这个类来访问我们刚刚创建的自定义列:
在模型文件夹中
public ApplicationRole()
: base() { }
public ApplicationRole(string name, long myCustomValue)
: base(name)
{
MyCustomValue = myCustomValue;
}
public virtual long MyCustomValue { get; set; }
然后,让我们创建一个继承自RoleManager<ApplicationRole> 的类。
我把它放在IdentityConfig.cs,但也许最好把它放在别处...
有关信息,我受到this blog 的启发,重新实现 RoleStore 和 ApplicationRoleManager 段落
public class ApplicationRoleManager : RoleManager<ApplicationRole>
{
public ApplicationRoleManager(
IRoleStore<ApplicationRole, string> roleStore)
: base(roleStore)
{
}
public static ApplicationRoleManager Create(
IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
{
return new ApplicationRoleManager(
new RoleStore<ApplicationRole>(context.Get<ApplicationDbContext>()));
}
}
ApplicationRoleManager 有一个构造函数,它调用我们之前创建的ApplicationRole 类。
现在我们必须在启动时注册我们的ApplicationRoleManager,所以我们必须在其他CreatePerOwinContext之后添加这一行
在 App_Start\Startup.auth.cs 中,ConfigureAuth(IAppBuilder app) 方法
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
所以现在我们可以使用我们的ApplicationRoleManager,正确实例化:
var rm = new ApplicationRoleManager(new RoleStore<ApplicationRole>(new ApplicationDbContext()));
然后按照我们的意愿使用它
var roleName = rm.FindByName("Admin");
string myCustomData = roleName.CustomData.ToString();