Identity 3.0 - 如何在分层应用程序中使用 AspNetUsers ID 作为外键
Identity 3.0 - How to use AspNetUsers ID as Foreign Key in a Tiered Application
意向:
一个 Subscriptions 数据库 table 包含一个 UserId 列,它与 Id AspNetUsers 的列 table。
项目设置(按其参考层次的顺序):
- Web 层(包含 ApplicationDbContext 和 ApplicationUser class)
- DTO层
- 数据访问层(包含 EFDbContext)
项目是 Code-First 配置。
数据库设置:
ApplicationDbContext 和 EFDbContext 引用相同的数据库。
- ApplicationDbContext:引用所有标识实体
- EFDbContext:引用我的订阅实体(以及其他)
问题:
鉴于我的 EFDbContext 位于我的数据层中,它不包含对 Identity 3.0 的任何引用,是否可以在 AspNetUsers 和订阅之间创建外键约束?
Is it possible to create a Foreign Key constraint between AspNetUsers and Subscriptions?
当然是。当你像那样跨越边界时,你会 运行 成为常事。
而不是让 EF 创建您需要的关系
- 创建一个新的空迁移
- 在up方法中添加定义外键的代码
- 在down方法中添加撤销外键的代码
- 运行数据库迁移
迁移看起来像:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddForeignKey(
name: "FK_Table_PrincipalTable_TableId",
table: "Table",
column: "PrincipalTableId",
principalTable: "PrincipalTable",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade)
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Table_PrincipalTable_TableId",
table: "Table");
}
意向:
一个 Subscriptions 数据库 table 包含一个 UserId 列,它与 Id AspNetUsers 的列 table。
项目设置(按其参考层次的顺序):
- Web 层(包含 ApplicationDbContext 和 ApplicationUser class)
- DTO层
- 数据访问层(包含 EFDbContext)
项目是 Code-First 配置。
数据库设置:
ApplicationDbContext 和 EFDbContext 引用相同的数据库。
- ApplicationDbContext:引用所有标识实体
- EFDbContext:引用我的订阅实体(以及其他)
问题:
鉴于我的 EFDbContext 位于我的数据层中,它不包含对 Identity 3.0 的任何引用,是否可以在 AspNetUsers 和订阅之间创建外键约束?
Is it possible to create a Foreign Key constraint between AspNetUsers and Subscriptions?
当然是。当你像那样跨越边界时,你会 运行 成为常事。
而不是让 EF 创建您需要的关系
- 创建一个新的空迁移
- 在up方法中添加定义外键的代码
- 在down方法中添加撤销外键的代码
- 运行数据库迁移
迁移看起来像:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddForeignKey(
name: "FK_Table_PrincipalTable_TableId",
table: "Table",
column: "PrincipalTableId",
principalTable: "PrincipalTable",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade)
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Table_PrincipalTable_TableId",
table: "Table");
}