ASP.NET核心标识用户声明体系结构



我正在手动将运行在.NET Framework 4.6项目上的ASP.NET MVC应用程序移动到ASP.NET Core 6.0,并且在尝试运行该应用程序时遇到问题。

现在我得到这个错误:

System.InvalidOperationException:"从'IdentityUserClaim'到具有外键属性{'UserId':string}的'User'的关系不能以主键{'Id':int}为目标,因为它不兼容。为此关系配置一个主密钥或一组具有兼容类型的外键属性。'

我的数据库配置似乎有些地方不正确。这就是我到目前为止所拥有的(为了方便而减少(。

DbContext

public class DbContext : IdentityDbContext<User>
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<AspNetRole>(entity =>
{
entity.HasIndex(e => e.Name, "RoleNameIndex")
.IsUnique()
.HasFillFactor(80);
entity.Property(e => e.Id).HasMaxLength(128);
entity.Property(e => e.Name)
.IsRequired()
.HasMaxLength(256);
});
modelBuilder.Entity<AspNetUser>(entity =>
{
entity.HasIndex(e => e.UserName, "UserNameIndex")
.IsUnique()
.HasFillFactor(80);
entity.Property(e => e.Id).HasMaxLength(128);
entity.Property(e => e.Email).HasMaxLength(256);
entity.Property(e => e.LockoutEndDateUtc).HasColumnType("datetime");
entity.Property(e => e.UserName)
.IsRequired()
.HasMaxLength(256);
entity.HasMany(d => d.Roles)
.WithMany(p => p.Users)
.UsingEntity<Dictionary<string, object>>(
"AspNetUserRole",
l => l.HasOne<AspNetRole>().WithMany().HasForeignKey("RoleId").HasConstraintName("FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId"),
r => r.HasOne<AspNetUser>().WithMany().HasForeignKey("UserId").HasConstraintName("FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId"),
j =>
{
j.HasKey("UserId", "RoleId").HasName("PK_dbo.AspNetUserRoles");
j.ToTable("AspNetUserRoles");
j.HasIndex(new[] { "RoleId" }, "IX_RoleId").HasFillFactor(80);
j.HasIndex(new[] { "UserId" }, "IX_UserId").HasFillFactor(80);
j.IndexerProperty<string>("UserId").HasMaxLength(128);
j.IndexerProperty<string>("RoleId").HasMaxLength(128);
});
});
modelBuilder.Entity<AspNetUserClaim>(entity =>
{
entity.HasIndex(e => e.UserId, "IX_UserId")
.HasFillFactor(80);
entity.Property(e => e.UserId)
.IsRequired()
.HasMaxLength(128);
entity.HasOne(d => d.User)
.WithMany(p => p.AspNetUserClaims)
.HasForeignKey(d => d.UserId)
.HasConstraintName("FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId");
});
modelBuilder.Entity<AspNetUserLogin>(entity =>
{
entity.HasKey(e => new { e.LoginProvider, e.ProviderKey, e.UserId })
.HasName("PK_dbo.AspNetUserLogins");
entity.HasIndex(e => e.UserId, "IX_UserId")
.HasFillFactor(80);
entity.Property(e => e.LoginProvider).HasMaxLength(128);
entity.Property(e => e.ProviderKey).HasMaxLength(128);
entity.Property(e => e.UserId).HasMaxLength(128);
entity.HasOne(d => d.User)
.WithMany(p => p.AspNetUserLogins)
.HasForeignKey(d => d.UserId)
.HasConstraintName("FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId");
});
modelBuilder.Entity<User>(entity =>
{
entity.ToTable("User");
});
}
}

User实体:

public class User : IdentityUser
{
public int Id { get; set; }
public string Username { get; set; }
}

我已尝试将以下内容添加到User实体并更新其关联的OnModelCreating配置。

用户实体尝试:

public virtual ICollection<AspNetUserClaim> AspNetUserClaims { get; set; } = new HashSet<AspNetUserClaim>();

DbContext OnModel创建尝试:

entity.HasMany(x => x.AspNetUserClaims)
.WithOne()
.HasForeignKey(x => x.UserId)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);

根据错误消息,您可能会发现您想将User的Id属性设置为具有User的UserId的外键。

由于UserId是字符串,Id是int,这就是它抛出此错误的原因。

为了解决这个问题,我建议您可以尝试将用户id的类型修改为字符串。

public class User : IdentityUser
{
public string Id { get; set; }
public string Username { get; set; }
}

最新更新