首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何用外键扩展IdentityUser

如何用外键扩展IdentityUser
EN

Stack Overflow用户
提问于 2021-01-25 18:13:01
回答 2查看 1K关注 1票数 0

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

代码语言:javascript
复制
public class ApplicationUser : IdentityUser
{
    public int BuildingID { get; set; }
}

我正在使用实体框架核心

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-25 21:23:44

更新:

这是一对多的方法。

我将我的ApplicationUser类更改为:

代码语言:javascript
复制
public class ApplicationUser : IdentityUser
{
    public int BuildingID { get; set; }
    [ForeignKey("BuildingID")]
    public Building building { get; set; }
}

然后我通过Package控制台添加了一个迁移:

代码语言:javascript
复制
add-migration identity-user-extention

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

代码语言:javascript
复制
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控制台中运行了以下命令:

代码语言:javascript
复制
Update-Database

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

票数 0
EN

Stack Overflow用户

发布于 2021-01-25 19:26:22

这是一个固执己见的回答。

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

在您的例子中,由于BuildingApplicationUser是一对一的关系,所以我建议不要将外键属性放在ApplicationUser类中。相反,将其放在Building类中。这样,就不会在AspNetUser表中创建新的列(也就是说,它将被单独保留),您将使Building成为依赖的实体,而不是ApplicationUser。因此,如果您要使用Cascading特性,删除一个Building将不会删除相关的ApplicationUser,而是相反。

代码语言:javascript
复制
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; }    
}

配置类似于-

代码语言:javascript
复制
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);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65890183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档