繁体   English   中英

如何使用外键扩展 IdentityUser

[英]How to extend IdentityUser with a foreign key

我正在尝试使用外键(BuildingID)扩展 IdentityUser。 下面是我的 ApplicationUser class,它派生自 IdentityUser class。 添加外键的正确方法是什么?

public class ApplicationUser : IdentityUser
{
    public int BuildingID { get; set; }
}

我正在使用实体框架核心

提前致谢

这是一个自以为是的答案。

在使用 ASP.NET 核心身份时,根据我的经验,最好不要理会IdentityUser ,用于身份验证等目的。 但是,如果您的应用程序不是那么大/复杂,我认为这个用户可以与其他实体建立关系。

在您的情况下,由于BuildingApplicationUser是一对一的关系,我建议不要将外键属性放在ApplicationUser class 中。 而是将其放在 class Building中。 这样,将不会在AspNetUser表中创建新列(即,它将被单独保留),并且您将Building依赖实体,而不是ApplicationUser 因此,如果您使用Cascading功能,删除Building不会删除相关的ApplicationUser ,而是相反。

public class ApplicationUser : IdentityUser
{
    public Building Building { get; set; }
}

public class Building
{
    public int Id { get; set; }
    public string Address { get; set; }
    public int ApplicationUserId { get; set; }
    
    public ApplicationUser ApplicationUser { get; set; }    
}

配置类似于 -

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Building>().ToTable("Building");
    modelBuilder.Entity<Building>(e =>
    {
        e.HasKey(p => p.Id);
        e.Property(p => p.Id).UseIdentityColumn<int>();     
        e.Property(p => p.Address).IsRequired(false).HasColumnType<string>("nvarchar(128)");
        e.Property(p => p.ApplicationUserId).IsRequired(true);
    });
    modelBuilder.Entity<Building>()
        .HasOne(e => e.ApplicationUser)
        .WithOne(p => p.Building)
        .HasForeignKey<Building>(e => e.ApplicationUserId)
        .OnDelete(DeleteBehavior.Cascade);
}

更新:

这是一对多的方法

我将 ApplicationUser class 更改为以下内容:

public class ApplicationUser : IdentityUser
{
    public int BuildingID { get; set; }
    [ForeignKey("BuildingID")]
    public Building building { get; set; }
}

然后我通过 Package 管理器控制台添加了迁移:

add-migration identity-user-extention

迁移完成后,我编辑了生成的代码并删除了所有创建和删除表的代码。 这背后的原因是它试图重新创建我已经生成的所有表。

public partial class identity-user-extention: Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AddColumn<int>(
            name: "BuildingID",
            table: "AspNetUsers",
            nullable: false,
            defaultValue: 0);

        migrationBuilder.CreateIndex(
            name: "IX_AspNetUsers_BuildingID",
            table: "AspNetUsers",
            column: "BuildingID");

        migrationBuilder.AddForeignKey(
            name: "FK_AspNetUsers_BUILDING_BuildingID",
            table: "AspNetUsers",
            column: "BuildingID",
            principalTable: "BUILDING",
            principalColumn: "BUILDING_ID",
            onDelete: ReferentialAction.Cascade);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropForeignKey(
            name: "FK_AspNetUsers_BUILDING_BuildingID",
            table: "AspNetUsers");

        migrationBuilder.DropIndex(
            name: "IX_AspNetUsers_BuildingID",
            table: "AspNetUsers");

        migrationBuilder.DropColumn(
            name: "BuildingID",
            table: "AspNetUsers");
    }
}

我保存了迁移,然后在 Package 管理器控制台中运行以下命令:

Update-Database

然后,我能够使用 buildingID 作为外键成功创建一个帐户(Buildings 表已经填充)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM