我正在使用 Entity Framework Core 6.0 和 SQL Server。
我正在尝试更新关系数据库以反映此图: 其中关系上的单条红线代表
ON DELETE CASCADE
,双红线代表ON DELETE SET NULL
.
Users
表以两种不同的方式与 Groups
相关:
UserGroups
显示哪个用户属于哪个hroupsGroup.GroupCreatorID
存储创建组的用户ID据我所知,这个设置意味着我需要在
GroupCreator
外键上有一个 delete 属性,告诉它如果用户被删除不要删除用户的组,以防止多个级联删除达到UserGroup
.
为此,我使用
DbContext
中的 Fluent API 来配置关系,如下所示:
// N-N relationship between Users and Groups
modelBuilder.Entity<ApplicationUser>()
.HasMany(u => u.Groups)
.WithMany(g => g.Users);
// 1-N relationship - one user can create many groups
modelBuilder.Entity<Group>()
.HasOne(g => g.GroupCreator)
.WithMany(u => u.CreatedGroups)
.HasForeignKey(g => g.GroupCreatorID)
.IsRequired(false)
.OnDelete(DeleteBehavior.SetNull);
modelBuilder.Entity<Group>()
.ToTable("Group");
使用包管理器控制台我可以成功创建一个迁移,在 Up 方法中有这个:
migrationBuilder.DropForeignKey(
name: "FK_Group_AspNetUsers_GroupCreatorID",
table: "Group");
migrationBuilder.AddForeignKey(
name: "FK_Group_AspNetUsers_GroupCreatorID",
table: "Group",
column: "GroupCreatorID",
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.SetNull);
然而,当我运行 Update-Database 时,出现以下错误:
失败:Microsoft.EntityFrameworkCore.Database.Command[20102]
执行 DbCommand 失败(12 毫秒)[Parameters=[],CommandType='Text',CommandTimeout='30']
ALTER TABLE [Group] ADD CONSTRAINT [FK_Group_AspNetUsers_GroupCreatorId] FOREIGN KEY ([GroupCreatorId]) REFERENCES [AspNetUsers] ([Id]) ON DELETE CASCADE;执行 DbCommand 失败(12 毫秒)[Parameters=[],CommandType='Text',CommandTimeout='30']
ALTER TABLE [Group] ADD CONSTRAINT [FK_Group_AspNetUsers_GroupCreatorId] FOREIGN KEY ([GroupCreatorId]) REFERENCES [AspNetUsers] ([Id]) ON DELETE CASCADE;
看起来它仍在尝试使用 ON DELETE CASCADE,即使我专门设置了它。
我尝试使用 FluentAPI 并在模型中使该字段可为空。
我也尝试将迁移的
migrationBuilder.AddForeignKey()
方法中的Up()
调用更改为migrationBuilder.Sql("ALTER TABLE[Group] ADD CONSTRAINT[FK_Group_AspNetUsers_GroupCreatorId] FOREIGN KEY([GroupCreatorId]) REFERENCES[AspNetUsers]([Id]) ON DELETE SET NULL");
,我遇到了与以前相同的问题。
我可以覆盖我在SQL Server对象资源管理器中找到的现有DDL语句中的
ON DELETE
部分,但我希望能够继续迁移到数据库中。由于这是一个学校项目,我必须在多个设备上使用本地数据库,只要我可以通过迁移更新它,它就适合我的目的。
对不起,如果这个问题太长,我不确定需要提供多少信息,因为我没有完全理解这个问题。谢谢