2017-01-25 178 views
1

我重写身份类:ASP.NET芯的indentity错误:实体类型“AppUserLogin”与单个键属性定义的,但2个值被传递到“DbSet.Find”方法

[Table("Roles")] 
    public partial class AppRole : IdentityRole<int, AppUserRole, AppRoleClaim> 
    { 
    } 
    [Table("RoleClaims")] 
    public partial class AppRoleClaim : IdentityRoleClaim<int> 
    { 
    } 
    [Table("Users")] 
    public partial class AppUser : IdentityUser<int, AppUserClaim, AppUserRole, AppUserLogin> 
    {  
    } 
    [Table("UserClaims")] 
    public partial class AppUserClaim : IdentityUserClaim<int> 
    { 
    } 
    [Table("UserLogins")] 
    public partial class AppUserLogin : IdentityUserLogin<int> 
    { 
     [Key] 
     [Required] 
     public int Id { get; set; } 
    } 
    [Table("UserRoles")] 
    public partial class AppUserRole : IdentityUserRole<int> 
    { 
    } 
    [Table("UserTokens")] 
    public partial class AppUserToken : IdentityUserToken<int> 
    { 
     [Key] 
     [Required] 
     public int Id { get; set; } 
    } 

    public class AppRoleManager : RoleManager<AppRole> 
    { 
     public AppRoleManager(IRoleStore<AppRole> store, IEnumerable<IRoleValidator<AppRole>> roleValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, ILogger<RoleManager<AppRole>> logger, IHttpContextAccessor contextAccessor) : base(store, roleValidators, keyNormalizer, errors, logger, contextAccessor) 
     { 
     } 
    } 
    public class AppRoleStore : RoleStore<AppRole, AppDbContext, int, AppUserRole, AppRoleClaim> 
    { 
     public AppRoleStore(AppDbContext context, IdentityErrorDescriber describer = null) : base(context, describer) 
     { 
     } 

     protected override AppRoleClaim CreateRoleClaim(AppRole role, Claim claim) 
     { 
      return new AppRoleClaim(role, claim); 
     } 
    } 
    public class AppSignInManager : SignInManager<AppUser> 
    { 
     public AppSignInManager(UserManager<AppUser> userManager, IHttpContextAccessor contextAccessor, IUserClaimsPrincipalFactory<AppUser> claimsFactory, IOptions<IdentityOptions> optionsAccessor, ILogger<SignInManager<AppUser>> logger) : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger) 
     { 
     } 
    } 
    public class AppUserManager : UserManager<AppUser> 
    { 
     public AppUserManager(IUserStore<AppUser> store, IOptions<IdentityOptions> optionsAccessor, IPasswordHasher<AppUser> passwordHasher, IEnumerable<IUserValidator<AppUser>> userValidators, IEnumerable<IPasswordValidator<AppUser>> passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger<UserManager<AppUser>> logger) : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger) 
     { 
      var LoginStore = Store; 
     } 
    } 
    public class AppUserStore : UserStore<AppUser, AppRole, AppDbContext, int, AppUserClaim, AppUserRole, AppUserLogin, AppUserToken, AppRoleClaim> 
    { 
     public AppUserStore(AppDbContext context, IdentityErrorDescriber describer = null) : base(context, describer) 
     { 
     } 

     protected override AppUserClaim CreateUserClaim(AppUser user, Claim claim) 
     { 
      return new AppUserClaim(user, claim); 
     } 

     protected override AppUserLogin CreateUserLogin(AppUser user, UserLoginInfo login) 
     { 
      return new AppUserLogin(user, login); 
     } 

     protected override AppUserRole CreateUserRole(AppUser user, AppRole role) 
     { 
      return new AppUserRole(user, role); 
     } 

     protected override AppUserToken CreateUserToken(AppUser user, string loginProvider, string name, string value) 
     { 
      return new AppUserToken(user, loginProvider, name, value); 
     } 
    } 

和我要使用外部登录谷歌,但是当我打电话await UserManager.FindByLoginAsync(info.LoginProvider, info.ProviderKey);我得到错误:

Entity type 'AppUserLogin' is defined with a single key property, but 2 values were passed to the 'DbSet.Find' method.

我下面的教程openiddictASP.NET Core and Angular 2,但我敢肯定,这个错误没有与此2个教程什么。我认为我的代码不工作,因为我更改了用户登录表的TKey:public partial class AppUserLogin : IdentityUserLogin<int>。即使搜索is defined with a single key property也没有结果。

回答

1

解决方法是在DbContext.OnModelCreating方法。 我改变来自:

modelBuilder.Entity<AppUserLogin>(entity => 
    { 
     entity 
     .HasKey(u => u.Id); 
     entity.Property(p => p.Id) 
     .ValueGeneratedOnAdd(); 
    }); 

到:

modelBuilder.Entity<AppUserLogin>(entity => 
    { 
     entity 
     .HasKey(u => u.Id); 
     entity.Property(p => p.Id) 
     .ValueGeneratedOnAdd(); 
     entity 
     .HasKey(u => new { u.LoginProvider, u.ProviderKey }); 
    }); 

和它的作品。

相关问题