我正在尝试用外键( IdentityUser )扩展BuildingID。下面是我的ApplicationUser类,它来自于IdentityUser类。添加外键的正确方法是什么?
public class ApplicationUser : IdentityUser
{
public int BuildingID { get; set; }
}
我正在使用实体框架核心
提前感谢
发布于 2021-01-25 21:23:44
更新:
这是一对多的方法。
我将我的ApplicationUser类更改为:
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表)。
发布于 2021-01-25 19:26:22
这是一个固执己见的回答。
在使用ASP.NET核心身份时,根据我的经验,最好不要使用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);
}
https://stackoverflow.com/questions/65890183
复制相似问题