我尝试仅使用AspNetUsers,AspNetRoles和AspNetUserRoles定制EntityFrameworkCore标识......有可能吗?
我的代码:
ApplicationUser.cs
public class ApplicationUser : IdentityUser<int>
{
}
ApplicationDbContext.cs
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, IdentityRole<int>, int>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
//base.OnModelCreating(builder);
builder.Entity<IdentityUser<int>>().ForSqlServerToTable("AspNetUsers")
//.Ignore(x => x.Claims)
//.Ignore(x => x.Logins)
.HasKey(x => x.Id);
builder.Entity<IdentityRole<int>>().ForSqlServerToTable("AspNetRoles")
//.Ignore(x => x.Claims)
.HasKey(x => x.Id);
builder.Entity<IdentityUserRole<int>>().ForSqlServerToTable("AspNetUserRoles")
.HasKey(x => new { x.UserId, x.RoleId });
builder.Ignore<IdentityUserLogin<int>>();
builder.Ignore<IdentityUserToken<int>>();
builder.Ignore<IdentityUserClaim<int>>();
builder.Ignore<IdentityRoleClaim<int>>();
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
...
services.AddIdentity<ApplicationUser, IdentityRole<int>>()
.AddEntityFrameworkStores<ApplicationDbContext, int>()
.AddDefaultTokenProviders();
...
}
AccountController.cs
public async Task<IActionResult> Register(RegisterViewModel model, string returnUrl = null)
{
...
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await _signInManager.SignInAsync(user, isPersistent: false);
return RedirectToLocal(returnUrl);
}
AddErrors(result);
}
return View(model);
}
CreateAsync =成功,但 SignInAsync 返回 InvalidOperationException:无法为&#39; IdentityUserClaim`1&#39;创建DbSet。因为此类型未包含在上下文的模型中。
我的数据库只包含AspNetRoles,AspNetUsers和AspNetUserRoles表,默认列(Id&#39;类型为int)。
感谢。
答案 0 :(得分:0)
我有类似的问题,但我创建了一个继承的XXXRole。错误是:无法为&#39; XXXRole&#39;创建DbSet。因为此类型未包含在上下文的模型中。
事实证明我还需要让AppDbContext知道正在使用哪个角色,否则它会假设......
所以我将它添加到IdentityDbContext的泛型类型中:
public class ApplicationDbContext : IdentityDbContext<XXXUser, XXXRole, string>
{
....
}
在上面这种情况下,我建议你创建一个继承自#34; IdentityRole&#34;的新具体类。然后你会做类似的事情:
public class ApplicationDbContext : IdentityDbContext<XXXUser, XXXRole, int>
{
....
}
我认为相同的数据类型的密钥用于用户和角色 - 因此您可能还需要创建XXXUser:IdentityUser
答案 1 :(得分:0)
我偶然发现了同样的问题,即使你的错误是愚蠢的,它可以帮助将来的某个人:
我已经命名
public class IdentityDbContext: IdentityDbContext<User>
{
....
}
当我引用它时,我没有指定应该从哪个命名空间IdentityDbContext
(*正确的是MyNamespace.IdentityDbContext
(doh!))
答案 2 :(得分:0)
我在这里添加了类似问题的答案.. 请参阅此https://stackoverflow.com/a/46935535/2903863