如何解决如何使用外键扩展 IdentityUser
我正在尝试使用外键 (BuildingID) 扩展 IdentityUser。下面是我的 ApplicationUser 类,它派生自 IdentityUser 类。添加外键的正确方法是什么?
public class ApplicationUser : IdentityUser
{
public int BuildingID { get; set; }
}
我正在使用实体框架核心
提前致谢
解决方法
这是一个固执的答案。
在使用 ASP.NET Core Identity 时,根据我的经验,最好不要使用 IdentityUser
,用于身份验证等目的。但是,如果您的应用程序不是那么大/那么复杂,我认为该用户可以与其他实体建立关系。
在您的情况下,由于 Building
和 ApplicationUser
是一对一的关系,我建议不要将外键属性放在 ApplicationUser
类中。而是将它放在 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 类更改为以下内容:
public class ApplicationUser : IdentityUser
{
public int BuildingID { get; set; }
[ForeignKey("BuildingID")]
public Building building { get; set; }
}
然后我通过包管理器控制台添加了一个迁移:
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",column: "BuildingID");
migrationBuilder.AddForeignKey(
name: "FK_AspNetUsers_BUILDING_BuildingID",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");
}
}
我保存了迁移,然后在包管理器控制台中运行以下命令:
Update-Database
然后我就能够成功地创建一个以 buildingID 作为外键的帐户(已经填充了 Buildings 表)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。