ASP.NET Core 异常:与 IdentityUser 创建一对一关系后无法为“IdentityUser”创建 DbSet

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

我现在刚刚从大量使用 ASP.NET MVC 转向 ASP.NET Core。我有一个针对 .NET 8.0 的 VS 2022 项目。

我想与

IdentityUser
创建一对一的表关系来存储额外信息,例如人员或个人资料)。

一切都可以编译,但是当我尝试注册时,出现以下异常:

无法为“IdentityUser”创建 DbSet,因为此类型未包含在上下文的模型中

我知道为什么我得到它,因为我的

DbContext
现在有了
DbSet<CustomUser>

IdentityUser
和人之间实现这种一对一关系并尽可能保持标准身份代码完整的最佳方法是什么?

这是我的模型:

public class CustomUser : IdentityUser
{
    public Person? Person { get; set; }
}

public class Person
{
    [Key]
    public string PersonId { get; set; }
    public string Firstname { get; set; } = String.Empty;
    public string Surname { get; set; } = String.Empty;
    public long DepartmentId { get; set; }
    public long LocationId { get; set; }

    public CustomUser AppUser { get; set; }
}

这是我的

DbContext

public class ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) 
    : IdentityDbContext<CustomUser>(options)
{
    public DbSet<Person> Persons { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<CustomUser>()
            .HasOne(c => c.Person)
            .WithOne(c => c.AppUser)
            .HasForeignKey<Person>(x => x.PersonId);

        base.OnModelCreating(builder);
    }
}

代码在登录后处理中的以下行失败。

var result = await _userManager.CreateAsync(user, Input.Password); 

如有任何帮助,我们将不胜感激。

c# asp.net-core one-to-one asp.net-core-identity asp.net-core-8
1个回答
0
投票

关于此错误:

无法为“IdentityUser”创建 DbSet,因为此类型未包含在上下文的模型中

如果我还用的话可以重现

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true).AddUserManager<UserManager<IdentityUser>>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

并将

UserManager<IdentityUser> userManager
注入控制器中。
但您需要将所有
IdentityUser
更改为
CustomUser
。只需搜索整个项目并替换它们即可解决此错误。

根据您扩展 IdentityUser 属性的需要,您可以轻松地在

CustomUser
类中扩展它们:

    public class CustomUser : IdentityUser
    {
        public string PersonId { get; set; }
        public string Firstname { get; set; } = String.Empty;
        public string Surname { get; set; } = String.Empty;
        public long DepartmentId { get; set; }
        public long LocationId { get; set; }
    }

如果你仍然想要一对一的关系,你可以通过属性为它们指定外键。

    public class CustomUser : IdentityUser
    {
        [ForeignKey("Person")]
        public string? FK_PersonId { get; set; }
        public Person? Person { get; set; }
    }

    public class Person
    {
        [Key]
        public string PersonId { get; set; }
        public string Firstname { get; set; } = String.Empty;
        public string Surname { get; set; } = String.Empty;
        public long DepartmentId { get; set; }
        public long LocationId { get; set; }

        public CustomUser AppUser { get; set; }
    }

然后你只需要在 DbContext 中关注即可。

            builder.Entity<CustomUser>()
                .HasOne(c => c.Person)
                .WithOne(c => c.AppUser);
© www.soinside.com 2019 - 2024. All rights reserved.