• 【EFCORE笔记】删除数据的多种方案


    DbContext 或DbSet 上使用Remove 方法

    已经跟踪对象删除:

    var blog = context.Blogs.Find(1); 
    Console.WriteLine(context.Entry(blog).State);
    
    context.Blogs.Remove(blog);
    
    Console.WriteLine(context.Entry(blog).State);
    
    
    context.SaveChanges(); 
    
    Console.WriteLine(context.Entry(blog).State);
    

      

    未跟踪对象删除:

    var blog = new Blog { BlogId = 4 }; 
    Console.WriteLine(context.Entry(blog).State);
    
    context.Remove(blog);
    
    Console.WriteLine(context.Entry(blog).State);
    
    
    context.SaveChanges(); 
    
    Console.WriteLine(context.Entry(blog).State);
    

      

    显式设置 EntityState 状态

    已跟踪对象状态标记删除:

    var blog = context.Blogs.Find(2);
    
    Console.WriteLine(context.Entry(blog).State);
    
    
    context.Entry(blog).State = EntityState.Deleted; 
    
    Console.WriteLine(context.Entry(blog).State);
    
    context.SaveChanges();
    
    Console.WriteLine(context.Entry(blog).State);
    

      

    未跟踪游离状态的删除(有主键即可):

    var blog = new Blog { BlogId = 3 };
    
    Console.WriteLine(context.Entry(blog).State);
    
    context.Entry(blog).State = EntityState.Deleted; 
    Console.WriteLine(context.Entry(blog).State);
    
    context.SaveChanges();
    
    Console.WriteLine(context.Entry(blog).State);
    

      

    批量删除数据

    void RemoveRange([NotNullAttribute] IEnumerable<object> entities);
    
    void RemoveRange([NotNullAttribute] params object[] entities);
    

      

    使用存储过程或者原生SQL删除数据

    _context.Database.ExecuteSqlCommand("SQL");
    

      

    级联删除

    级联删除是数据库的常用术语,允许在删除某行时自动触发删除相关行的特性,这通常称为:删除孤立项。EF Core 默认根据必需和可选约定判定删除行为,也可显式指定不同的删除行为。

    必需和可选的关系(默认)

    modelBuilder.Entity<Post>()
    .HasOne(p => p.Blog)
    .WithMany(b => b.Posts)
    .IsRequired();
    

      

    显式指定级联关系

    modelBuilder.Entity<Post>()
    .HasOne(p => p.Blog)
    .WithMany(b => b.Posts)
    .OnDelete(DeleteBehavior.Cascade);
    

      

    删除父实体时可以执行三种操作

    1. 可以删除子项/依赖项
    2. 子项的外键值可以设置为 null
    3. 子项保持不变

    1种就是级联删除,即删除父项时自动删除相关的子项。

    2种是删除父项时,将子项对应的外键值设置为null,如果该字段不能为null,则抛出异常。

    3种就是约束了,因为删除父项而子项保持不变,这是违反数据库约束的,如果父项已经被引用,直接抛出异常。

    对内存实体和数据库的影响对比

    可选关系:对于可选关系(可以为 null 的外键),可以保存 null 外键值。

    行为名称

    对内存中的依赖项/子项的影响

    对数据库中的依赖项/子项的影响

    Cascade

    删除实体

    删除实体

    ClientSetNull(默认)

    外键属性设置为 null

    SetNull

    外键属性设置为 null

    外键属性设置为 null

    Restrict

    必选关系:对于必选关系(不可为 null 的外键),不可以保存 null 外键值。

    行为名称

    对内存中的依赖项/子项的影响

    对数据库中的依赖项/子项的影响

    Cascade(默认)

    删除实体

    删除实体

    ClientSetNull

    SaveChanges 引发异常

    SetNull

    SaveChanges 引发异常

    SaveChanges 引发异常

    Restrict

  • 相关阅读:
    MVC模式在Java Web应用程序中的实例分析
    设计模式
    实现xxxxxxx系统六大质量属性战术
    阅读了《大型网站技术架构:核心原理与案例分析》,分析XX系统如何增加相应的功能,提高系统的可用性和易用性
    淘宝系统质量属性分析
    《架构漫谈》读后感
    软件架构师架构设计过程是什么?
    《架构之美》阅读笔记06
    《架构之美》阅读笔记05
    《架构之美》阅读笔记04
  • 原文地址:https://www.cnblogs.com/lbonet/p/14604408.html
Copyright © 2020-2023  润新知