如何修复错误外键属性“ApplicationUserClaim.UserId1”是在影子状态下创建的

问题描述 投票:0回答:1

我正在使用

  • Microsoft.EntityFrameworkCore.SqlServer 8.0
  • Microsoft.AspNetCore.Identity.EntityFrameworkCore 8.0

我试图解决的总体问题是以下代码无法与开箱即用的

Microsoft.AspNetCore.Identity
一起使用。

var usersClaims = await applicationDbContext.UserClaims.Include(uc=>uc.User).ToListAsync(); 

IdentityUserClaim
没有
User
的烘焙属性。
IdentityUser
没有
ICollection<ApplicationUserClaim> Claims
的烘焙属性。

所以我在自己的类中添加了属性,并在

ApplicationDbContext
的声明中引用了新类:

IdentityDbContext<ApplicationUser, ..., ApplicationUserClaim,...> 

参见下面相关代码:

public class ApplicationUser : IdentityUser<string>
{
    [Column(TypeName = "varchar(100)")]
    [MaxLength(100)]
    public string FirstName { get; set; } = string.Empty;

    [Column(TypeName = "varchar(100)")]
    [MaxLength(100)]
    public string LastName { get; set; } = string.Empty;
    public string FullName => $"{FirstName} {LastName}";

    [Required]
    public bool Enabled { get; set; } = true;

    public virtual ICollection<ApplicationUserClaim> Claims { get; set; } 
       = new List<ApplicationUserClaim>();
}
public class ApplicationUserClaim : IdentityUserClaim<string>
{
    [ForeignKey("User")]
    public override string UserId { get; set; } = null!;

    public virtual ApplicationUser User { get; set; } = null!;
}
ApplicationDbContext : IdentityDbContext<
        ApplicationUser,
        IdentityRole<string>,
        string,
        ApplicationUserClaim,
        IdentityUserRole<string>,
        IdentityUserLogin<string>,
        IdentityRoleClaim<string>,
        IdentityUserToken<string>>
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    ...
    modelBuilder.Entity<ApplicationUserClaim>(entity =>
    {
         entity.HasOne(uc => uc.User)
               .WithMany(u => u.Claims)
               .HasForeignKey(uc => uc.UserId);
    });
    ...
}

当我添加迁移并更新数据库时,EF Core 会在

AspNetUsers <1--∞> AspNetUserClaims
之间创建重复的一对多关系。为什么?

我需要帮助的错误是:

Microsoft.EntityFrameworkCore.Model.Validation[10625]国外 关键属性“ApplicationUserClaim.UserId1”是在影子中创建的 状态,因为属性与简单名称“UserId”发生冲突 存在于实体类型中,但要么未映射,要么已存在 用于其他关系,或与当前关系不相容 关联的主键类型。请参阅https://aka.ms/efcore-relationships 有关 EF Core 中映射关系的信息。

entity-framework-core asp.net-core-identity ef-core-8.0
1个回答
0
投票

您可能会遇到此问题,因为 EF Core 会根据 Identity 框架的默认行为自动创建

ApplicationUser
IdentityUserClaim
之间的关系。当您在
ApplicationUserClaim
中定义新关系时,EF Core 会感到困惑,因为它看到两个潜在关系,但只有一个外键属性 (
UserId
)。

要解决此问题,您可以使用

OnModelCreating
中的 Fluent API 配置来清晰定义关系并避免歧义。这涉及准确告诉 EF Core 如何解释
ApplicationUser
ApplicationUserClaim
IdentityUserClaim
之间的关系。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<ApplicationUserClaim>(entity =>
    {
        entity.HasOne(uc => uc.User)
              .WithMany(u => u.Claims)
              .HasForeignKey(uc => uc.UserId)
              .IsRequired();
    });
}

您可以参考以下文档以获取有关配置关系的更多详细信息:

https://learn.microsoft.com/en-us/ef/core/modeling/relationships

© www.soinside.com 2019 - 2024. All rights reserved.