我正在手动将运行在.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; }
}