【问题标题】:Setting the On Update Cascade Constraint with Entity Framework Core使用 Entity Framework Core 设置 On Update Cascade 约束
【发布时间】:2018-08-01 19:40:38
【问题描述】:

在 Entity Framework Core 中有大量关于为外键关系设置删除操作的行为的信息,但是,我发现关于如何指定“更新级联”的细节几乎为零外键的约束。

我找到的最接近的是 this 迁移相关的 Microsoft 文档。

public void Configure(EntityTypeBuilder<Something> builder)
{
    builder
        .HasOne(s => s.Thing)
        .WithMany(t => t.Somethings)
        .HasForeignKey(s => s.ThingId)
        --> Like Delete behavior, how to set update behavior?
        .OnDelete(DeleteBehavior.Cascade);
}

如何使用 Fluent API 做到这一点?

【问题讨论】:

  • 您找不到此类信息,因为根本没有此类功能(EF6 和 EF Core 均不支持)。这是没有意义的,因为 EF (Core) 不允许修改 PK。您所能做的就是将DeleteBehavior.SetNull 用于可选 关系。
  • 是的,您可以在迁移中设置它:ForeignKey(onUpdate: ReferentialAction.Cascade) 但是,它只对在 EF 之外进行的更新有用。

标签: entity-framework ef-core-2.1


【解决方案1】:

更新:这仍然不能解决“context.SaveChanges();”时的根本问题它仍然会抛出错误。您必须清空数据库中的记录,然后重新填充它。

我一直在寻找完全相同的东西,并且找到了解决方法。据我所知,您还不能在 Fluent API 中执行此操作。您可以手动将其添加到迁移中。

  1. 添加迁移
  2. 打开迁移
  3. 找到“onDelete:ReferentialAction.Cascade);”
  4. 在其上方的行中,插入“onUpdate: ReferentialAction.Cascade”,
  5. 更新和测试数据库
  6. 请参阅下文

            migrationBuilder.CreateTable(
            name: "AgencyMembers",
            columns: table => new
            {
                ApplicationUserId = table.Column<string>(maxLength: 450, nullable: false),
                AgencyId = table.Column<int>(nullable: false),
                AgencyName = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_AgencyMembers", x => new { x.ApplicationUserId, x.AgencyId });
                table.ForeignKey(
                    name: "FK_AgencyMembers_AspNetUsers_ApplicationUserId",
                    column: x => x.ApplicationUserId,
                    principalTable: "AspNetUsers",
                    principalColumn: "Id",
                    ***onUpdate: ReferentialAction.Cascade,***
                    onDelete: ReferentialAction.Cascade);
                table.ForeignKey(
                    name: "FK_AgencyMembers_Agencies_AgencyId_AgencyName",
                    columns: x => new { x.AgencyId, x.AgencyName },
                    principalTable: "Agencies",
                    principalColumns: new[] { "AgencyId", "AgencyName" },
                    ***onUpdate: ReferentialAction.Cascade,***
                    onDelete: ReferentialAction.Cascade);
            });
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2016-07-12
    • 2010-12-01
    • 2015-01-06
    • 2013-12-06
    相关资源
    最近更新 更多