zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    OC方法交换swizzle详细介绍——不再有盲点
    集合深浅拷贝以及经常遇到的坑(面试常问)
    网络安全——一图看懂HTTPS建立过程
    NSTimer定时器进阶——详细介绍,循环引用分析与解决
    NSRunLoop原理详解——不再有盲点
    灵活、可高度自定义的——Progress进度圈、弹窗、加载进度、小菊花
    swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
    swift学习笔记4——扩展、协议
    swift学习笔记3——类、结构体、枚举
    个推推送处理
  • 原文地址:https://www.cnblogs.com/lbonet/p/14604408.html
Copyright © 2011-2022 走看看