我正在使用
我试图解决的总体问题是以下代码无法与开箱即用的
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 中映射关系的信息。
您可能会遇到此问题,因为 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