.net core EF DeleteBehavior
ef 级联删除
DeleteBehavior
| ascade | 2 |
依赖实体也会被删除。 此级联行为仅适用于由上下文跟踪的实体。 应在数据库中设置相应的级联行为,以确保上下文未跟踪的数据应用了相同的操作。 如果使用 EF 创建数据库,则会为你设置此级联行为。 |
| Restrict | 0 |
删除操作不应用于依赖实体。 依赖实体保持不变。 |
| SetNull | 1 |
依赖实体中的外键属性设置为 null。 此级联行为仅适用于由上下文跟踪的实体。 应在数据库中设置相应的级联行为,以确保上下文未跟踪的数据应用了相同的操作。 如果使用 EF 创建数据库,则会为你设置此级联行为。 |
参考
DeleteBehavior 枚举 (Microsoft.EntityFrameworkCore.Metadata) | Microsoft Learn
public class PostMapper : IEntityTypeConfiguration<Post>
{
public void Configure(EntityTypeBuilder<Post> builder)
{
// Blog与Post之间为 1 - 多关联关系
builder.HasOne(p => p.Blog)
.WithMany(b => b.Posts)
.HasForeignKey(p => p.BId)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);
builder.ToTable("Post");
//设置属性Title最大长度70,列名在数据库显示为BlogTitle
builder.Property(a => a.Title).HasMaxLength(50).HasColumnName("Title");
//设置属性PostId,列名在数据库显示为Id
builder.Property(t => t.PostId).HasColumnName("Id");
}
}
在Entity Framework Core (EF Core) 中,`DeleteBehavior` 是一个枚举类型,用于定义在删除父实体时如何处理相关联的子实体。
`DeleteBehavior.Restrict` 是其中的一个选项,它表示在删除父实体时,如果存在相关联的子实体,则阻止删除操作。 ### `DeleteBehavior.Restrict` 的作用 当你在定义实体之间的关系时,可以指定 `DeleteBehavior`。`DeleteBehavior.Restrict`
的主要作用是防止级联删除。也就是说,当你尝试删除一个父实体时,如果该父实体有关联的子实体,EF Core 会阻止删除操作并抛出异常。 ### 示例 假设你有一个简单的博客应用,包含 `Blog` 和 `Post` 两个实体,其中 `Blog` 是父实体,`Post` 是子实体。每个 `Blog` 可以有多个 `Post`。 ```csharp public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List<Post> Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } } ``` 在 `DbContext` 中,你可以这样配置它们之间的关系: ```csharp public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .HasMany(b => b.Posts) .WithOne(p => p.Blog) .HasForeignKey(p => p.BlogId) .OnDelete(DeleteBehavior.Restrict); } } ``` 在这个配置中,`DeleteBehavior.Restrict` 表示如果尝试删除一个 `Blog` 实体,而该 `Blog` 实体有关联的 `Post` 实体,EF Core 会阻止删除操作并抛出异常。 ### 何时使用 `DeleteBehavior.Restrict` `DeleteBehavior.Restrict` 适用于你希望在删除父实体时,确保所有相关的子实体都被正确处理的场景。
例如,在某些业务逻辑中,你可能需要在删除父实体之前,先手动处理或删除相关的子实体,以避免数据不一致或丢失。 ### 其他 `DeleteBehavior` 选项 除了 `DeleteBehavior.Restrict`,EF Core 还提供了其他几种 `DeleteBehavior` 选项: - `DeleteBehavior.Cascade`:删除父实体时,自动删除所有相关的子实体。 - `DeleteBehavior.ClientCascade`:删除父实体时,客户端代码负责删除相关的子实体。 - `DeleteBehavior.NoAction`:删除父实体时,不采取任何行动,但可能会导致数据库级别的约束错误。 - `DeleteBehavior.SetNull`:删除父实体时,将子实体的外键设置为 `NULL`(前提是外键允许为 `NULL`)。 选择合适的 `DeleteBehavior` 取决于你的业务需求和数据模型。
浙公网安备 33010602011771号