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

  • 相关阅读:
    主机无法ping通网关,但可以ping通局域网内的其他主机
    linux下安装mysql
    国内python源
    在vue中引入element-ui时报错
    在windows上部署vue
    linux上部署vue开发环境
    vue插件之vue-router路由基本使用
    vue监听属性变化
    vue过滤器
    vue组件的使用
  • 原文地址:https://www.cnblogs.com/lbonet/p/14604408.html
Copyright © 2011-2022 走看看