You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向AspNetUserRoles表添加用户时遇UserId为空错误求助

向AspNetUserRoles表插入记录时提示“UserId为null”的问题求助

我被这个问题困扰一周了,现在寻求帮助:尝试向AspNetUserRoles表插入记录时,始终出现“UserId为null”的错误。

注:已成功将用户存入AspNetUser表、角色存入AspNetRole表,因此可能无需IdentityDbContext。

报错代码行:

await multiTierDbContext1.AspNetUserRoles.AddAsync(userRole);

用户注册接口代码

[HttpPost("register")]
public async Task<IActionResult> Register(UserRequest user)
{
    //var userName=   userManager.FindByNameAsync("Shubham.maini@bhn.com").Result;

    if (ModelState.IsValid)
    {                
        var users = new AspNetUser {Id= Guid.NewGuid().ToString(), Email =user.Email , UserName = user.Username, ConcurrencyStamp = Guid.NewGuid().ToString(), LockoutEnabled=false, NormalizedEmail =user.Email, NormalizedUserName =user.Username,Discriminator="abc"};
        var result = await userManager.CreateAsync(users, user.Password);
        if(!result.Succeeded)
        {
            return BadRequest(result);
        }
        
        if(user.Roles.Any())
        {
            foreach(var role in user.Roles)
            {
                var roleExist = _provider.GetService<IRoleStore<AspNetRole>>();
                var resultRow = new AspNetRole()
                {
                    Name = role
                };
                /*var resultS = await roleExist.CreateAsync(res, CancellationToken.None);*/
              
                var roleExists = await roleManager.RoleExistsAsync("Admin");
               
                if(!roleExists)
                {
                    resultRow.Id= Guid.NewGuid().ToString();
                    resultRow.NormalizedName = role.ToUpper();
                    var roleResult = await roleExist.CreateAsync(resultRow, CancellationToken.None);                           
                }
                var userRequest = new AspNetUser()
                {
                    UserName = user.Username,
                };
                var userss= await userManager.FindByNameAsync(user.Username);
                var response=await roleExist.FindByNameAsync("Admin", CancellationToken.None);
                
                if(userss.Id!=null! && response!=null)
                {
                    var userRole = new AspNetUserRole()
                    {
                        UserId =userss.Id,
                        RoleId = response.Id,
                    };
                    await multiTierDbContext1.AspNetUserRoles.AddAsync(userRole);
                    multiTierDbContext1.SaveChanges();               
                }                       
                //var userToRole = await userManager.AddToRoleAsync(userss, "ADMIN");
                /* var userRole = await userManager.IsInRoleAsync(userss, role);
                 if (!userRole)
                 {
                     var userToRole = await userManager.AddToRoleAsync(userss, "Admin");
                 }*/
            }
        }

        
        /*                var ApplicationUsers = new ApplicationUser { Email = user.Email, UserName = user.UserName };
                    multiTierDbContext.ApplicationUsers.Add(ApplicationUsers);
                    multiTierDbContext.SaveChanges();*/
        return Ok(result);
        
    }
    return Ok();
  
}

DbContext配置代码

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<IdentityUserRole<string>>()
               .ToTable("AspNetUserRoles");


    modelBuilder.Entity<IdentityUserRole<string>>()
         .HasKey(ur => new { ur.UserId, ur.RoleId });


    modelBuilder.Entity<AspNetUser>()
       .HasMany(u => u.Roles)
       .WithMany(r => r.Users)
       .UsingEntity<IdentityUserRole<string>>(
           ur => ur.HasOne<AspNetRole>().WithMany().HasForeignKey(ur => ur.RoleId).IsRequired(),
           ur => ur.HasOne<AspNetUser>().WithMany().HasForeignKey(ur => ur.UserId).IsRequired() );

    modelBuilder.Entity<AspNetRole>(entity =>
    {
        entity.HasKey(e => e.Id).HasName("PK_dbo.AspNetRoles");

        entity.Property(e => e.Id).HasMaxLength(128);
    });

    modelBuilder.Entity<AspNetUser>(entity =>
    {
        entity.HasKey(e => e.Id).HasName("PK_dbo.AspNetUsers");

        entity.Property(e => e.Id).HasMaxLength(128);
        entity.Property(e => e.Discriminator).HasMaxLength(128);

        entity.HasMany(d => d.Roles).WithMany(p => p.Users)
             .UsingEntity<Dictionary<string, object>>(
                 "AspNetUserRole",
                 r => r.HasOne<AspNetRole>().WithMany().HasForeignKey("RoleId"),
                 l => l.HasOne<AspNetUser>().WithMany().HasForeignKey("UserId"),
                 j =>
                 {
                     j.HasKey("UserId", "RoleId");
                     j.HasIndex(new[] { "RoleId" }, "IX_AspNetUserRoles_RoleId");
                 });
    });

    modelBuilder.Entity<AspNetUserClaim>(entity =>
    {
        entity.HasKey(e => e.Id).HasName("PK_dbo.AspNetUserClaims");

        entity.HasIndex(e => e.UserId, "IX_User_Id");

        entity.Property(e => e.UserId)
            .HasMaxLength(128)
            .HasColumnName("User_Id");

        entity.HasOne(d => d.User).WithMany(p => p.AspNetUserClaims)
            .HasForeignKey(d => d.UserId)
            .HasConstraintName("FK_dbo.AspNetUserClaims_dbo.AspNetUsers_User_Id");
    });

    modelBuilder.Entity<AspNetUserLogin>(entity =>
    {
        entity.HasKey(e => new { e.UserId, e.LoginProvider, e.ProviderKey }).HasName("PK_dbo.AspNetUserLogins");

        entity.HasIndex(e => e.UserId, "IX_UserId");

        entity.Property(e => e.UserId).HasMaxLength(128);
        entity.Property(e => e.LoginProvider).HasMaxLength(128);
        entity.Property(e => e.ProviderKey).HasMaxLength(128);

        entity.HasOne(d => d.User).WithMany(p => p.AspNetUserLogins)
            .HasForeignKey(d => d.UserId)
            .HasConstraintName("FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId");
    });

    modelBuilder.Entity<MigrationHistory>(entity =>
    {
        entity.HasKey(e => new { e.MigrationId, e.ContextKey }).HasName("PK_dbo.__MigrationHistory");

        entity.ToTable("__MigrationHistory");

        entity.Property(e => e.MigrationId).HasMaxLength(150);
        entity.Property(e => e.ContextKey).HasMaxLength(300);
        entity.Property(e => e.ProductVersion).HasMaxLength(32);
    });

    OnModelCreatingPartial(modelBuilder);
}

扩展实体类代码

AspNetUser

using Microsoft.AspNetCore.Identity;
using System.ComponentModel.DataAnnotations.Schema;

namespace WebApi.Database.Models;
/*  [Table("AspNetUsers")]*/
public partial class AspNetUser : IdentityUser
{
   public ICollection<AspNetUserRole> UserRoles { get; set; }
}

AspNetUserRole

using Microsoft.AspNetCore.Identity;

namespace WebApi.Database.Models;
public partial class AspNetUserRole : IdentityUserRole<string>
{
public override string RoleId { get; set; }

public override string UserId { get; set; }

public AspNetUser User { get; set; }

public AspNetRole Role { get; set; }
}

AspNetRole

using Microsoft.AspNetCore.Identity;
using System.ComponentModel.DataAnnotations.Schema;

namespace WebApi.Database.Models;
/*   [Table("AspNetRoles")]*/
public partial class AspNetRole : IdentityRole
{

public ICollection<AspNetUserRole> UserRoles { get; set; }
}

已尝试的解决方案

  • 使用userManager.AddToRoles()方法,仍出现相同错误
  • 直接向表中插入实体,错误依旧
  • 通过与scaffold生成实体同名的分部类进行扩展,避免修改原始实体类

完整错误信息

System.InvalidOperationException: Unable to track an entity of type 'AspNetUserRole' because its primary key property 'UserId' is null.
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NullableKeyIdentityMap`1.Add(InternalEntityEntry entry)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.StartTracking(InternalEntityEntry entry)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState oldState, EntityState newState, Boolean acceptChanges, Boolean modifyProperties)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityStateAsync(EntityState entityState, Boolean acceptChanges, Boolean modifyProperties, Nullable`1 forceStateWhenUnknownKey, Nullable`1 fallbackState, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.PaintActionAsync(EntityEntryGraphNode`1 node, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraphAsync[TState](EntityEntryGraphNode`1 node, Func`3 handleNode, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.AttachGraphAsync(InternalEntityEntry rootEntry, EntityState targetState, EntityState storeGeneratedWithKeySetTargetState, Boolean forceStateWhenUnknownKey, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.AddAsync(TEntity entity, CancellationToken cancellationToken)
   at WebApi.Controllers.PersonController.Register(UserRequest user)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)

内容的提问来源于stack exchange,提问作者shubham maini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:40:53