为什么 EF Core 在应用迁移时不使用 ON DELETE SET NULL?

问题描述 投票:0回答:0

我正在使用 Entity Framework Core 6.0 和 SQL Server。

我正在尝试更新关系数据库以反映此图: ER Diagram 其中关系上的单条红线代表

ON DELETE CASCADE
,双红线代表
ON DELETE SET NULL
.

Users
表以两种不同的方式与
Groups
相关:

  • 多对多通过
    UserGroups
    显示哪个用户属于哪个hroups
  • 一对多通过
    Group.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
部分,但我希望能够继续迁移到数据库中。由于这是一个学校项目,我必须在多个设备上使用本地数据库,只要我可以通过迁移更新它,它就适合我的目的。

对不起,如果这个问题太长,我不确定需要提供多少信息,因为我没有完全理解这个问题。谢谢

sql-server entity-framework-core database-migration ef-fluent-api on-delete
© www.soinside.com 2019 - 2024. All rights reserved.