如何定义DeleteBehavior类从另一个继承?



我知道我可以在属性中使用DeleteBehavior属性,问题是属性是继承的。

我有以下类:

[Table("Profiles")]
public class Profile 
{
public Guid Id { get; set; }
// ...
}
[Table("Agents")]
public class AgentProfile : Profile
{
// ...
}

生成的迁移:

migrationBuilder.CreateTable(
name: "Agents",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
// ...
},
constraints: table =>
{
table.PrimaryKey("PK_Agents", x => x.Id);
// ...
table.ForeignKey(
name: "FK_Agents_Profiles_Id",
column: x => x.Id,
principalTable: "Profiles",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});

问题出在这一行:

onDelete: ReferentialAction.Cascade);

如何将特定的FK标记为Restrict?我知道如何处理显式关系,例如:

EntityTypeBuilder<AgentProfile>
.HasMany(a => a.Cases)
.WithOne(c => c.Agent)
.OnDelete(DeleteBehavior.Restrict);

但是我不知道如何为我的场景(继承关系)做到这一点。迁移被创建(一个奇怪的行为从EF Core IMO,我认为错误应该在迁移创建期间抛出),但我不能更新数据库,因为我得到错误:

在表'Agents'上引入FOREIGN KEY约束'FK_Agents_Profiles_Id'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他外键约束。无法创建约束或索引。见前面的错误

我知道我可以简单地更改生成的迁移并将其更改为Restrict,但我不想这样做,否则它将是一个额外的步骤,使用FluentApi将是理想的。我也知道MS SQL Server有自己的限制,但我假设可以定义这种行为,而不必更改自动生成的迁移。我如何使用属性或FluentApi这样做?

使用EF Core 7.

ajcvickers的回应

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<AgentProfile>()
.HasOne<Profile>()
.WithOne()
.HasForeignKey<AgentProfile>(e => e.Id)
.OnDelete(DeleteBehavior.Restrict);
}

看到https://learn.microsoft.com/en - us/ef/core/what - new/ef核心- 7.0 -/-破坏-更改# tpt-cascade-delete

最新更新