0

我想与AspNetUsers,AspNetRoles和AspNetUserRoles自定义EntityFrameworkCore身份...这可能吗?自定义标识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:无法创建 'IdentityUserClaim`1' 一个DbSet因为这种类型没有在模型包括为上下文。

我的数据库仅包含带有默认列的AspNetRoles,AspNetUsers和AspNetUserRoles(Id的类型为int)。

感谢。

+0

为什么额外的4行忽略'IdentityUserClaim'等? – DavidG

+0

忽略IdentityUserLogin!= InvalidOperationException:实体类型'Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserLogin '需要定义一个密钥。 –

+0

没有额外的行返回 - > IdentityUserLogin 要求定义一个关键。 IdentityUserToken 需要定义一个密钥。 SqlException:无效的对象名称'UserClaims'。 SqlException:无效的对象名称'RolerClaims'。 –

回答

0

我有一个类似的问题,但我创建了一个继承的XXXRole。错误是:无法为'XXXRole'创建DbSet,因为此类型未包含在上下文的模型中。

事实证明,我需要也让AppDbContext知道正在使用哪个角色,否则假定...

所以我把它添加到泛型类型为IdentityDbContext:

public class ApplicationDbContext : IdentityDbContext<XXXUser, XXXRole, string> 
{ 
.... 
} 

在在上面这个例子中,我建议你创建一个从“IdentityRole”继承的新的具体类。然后,你会做这样的事情:

public class ApplicationDbContext : IdentityDbContext<XXXUser, XXXRole, int> 
{ 
.... 
} 

我认为关键的相同的数据类型同时用于用户和角色 - 所以你可能还需要创建XXXUser:IdentityUser

0

我偶然发现了同样的问题甚至你我的错误是愚蠢它可以帮助别人的未来:

我叫

public class IdentityDbContext: IdentityDbContext<User> { .... }

当我引用它,我没有什么从指定的命名空间应采取IdentityDbContext(*正确的是MyNamespace.IdentityDbContext(DOH!))