返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >ASP.NETCore使用EF保存数据、级联删除和事务使用
  • 309
分享到

ASP.NETCore使用EF保存数据、级联删除和事务使用

2024-04-02 19:04:59 309人浏览 独家记忆
摘要

目录1.简介2.基本保存2.1添加数据2.2更新数据2.3删除数据2.4单个SaveChanges中的多个操作3.保存关联数据3.1添加关联数据3.2添加相关实体3.3更改关系4.级

1.简介

每个上下文实例都有一个ChangeTracker,它负责跟踪需要写入数据库的更改。更改实体类的实例时,这些更改会记录在ChangeTracker中,然后在调用SaveChanges时会被写入数据库中。此数据库提供程序负责将更改转换为特定于数据库的操作(例如,关系数据库的INSERT、UPDATE和DELETE命令)。

2.基本保存

了解如何使用上下文和实体类添加、修改和删除数据。

2.1添加数据

使用DbSet.Add方法添加实体类的新实例。调用SaveChanges时,数据将插入到数据库中。

using (var context = new BlogginGContext())
{
    var blog = new Blog { Url = "Http://sample.com" };
    context.Blogs.Add(blog);
    context.SaveChanges();
}

2.2更新数据

EF将自动检测对由上下文跟踪的现有实体所做的更改。这包括从数据库加载查询的实体,以及之前添加并保存到数据库的实体。只需通过赋值来修改属性,然后调用SaveChanges即可。

using (var context = new BloggingContext())
{
    var blog = context.Blogs.First();
    blog.Url = "http://sample.com/blog";
    context.SaveChanges();
}

2.3删除数据

使用DbSet.Remove方法删除实体类的实例。如果实体已存在于数据库中,则将在SaveChanges期间删除该实体。如果实体尚未保存到数据库(即跟踪为“已添加”),则在调用SaveChanges时,该实体会从上下文中移除且不再插入。

using (var context = new BloggingContext())
{
    var blog = context.Blogs.First();
    context.Blogs.Remove(blog);
    context.SaveChanges();
}

2.4单个SaveChanges中的多个操作

可以将多个添加/更新/删除操作合并到对SaveChanges的单个调用。

using (var context = new BloggingContext())
{
    // add
    context.Blogs.Add(new Blog { Url = "http://sample.com/blog_one" });
    context.Blogs.Add(new Blog { Url = "http://sample.com/blog_two" });
    // update
    var firstBlog = context.Blogs.First();
    firstBlog.Url = "";
    // remove
    var lastBlog = context.Blogs.Last();
    context.Blogs.Remove(lastBlog);
    context.SaveChanges();
}

3.保存关联数据

除了独立实体以外,还可以使用模型中定义的关系。

3.1添加关联数据

如果创建多个新的相关实体,则将其中一个添加到上下文时也会添加其他实体。在下面的示例中,博客和三个相关文章会全部插入到数据库中。找到并添加这些文章,因为它们可以通过Blog.Posts导航属性访问。

using (var context = new BloggingContext())
{
    var blog = new Blog
    {
        Url = "http://blogs.msdn.com/dotnet",
        Posts = new List<Post>
        {
            new Post { Title = "Intro to C#" },
            new Post { Title = "Intro to VB.NET" },
            new Post { Title = "Intro to F#" }
        }
    };
    context.Blogs.Add(blog);
    context.SaveChanges();
}

3.2添加相关实体

如果从已由上下文跟踪的实体的导航属性中引用新实体,则将发现该实体并将其插入到数据库中。在下面的示例中,插入post实体,因为该实体会添加到已从数据库中提取的blog实体的Posts属性。

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Include(b => b.Posts).First();
    var post = new Post { Title = "Intro to EF Core" };
    blog.Posts.Add(post);
    context.SaveChanges();
}

3.3更改关系

如果更改实体的导航属性,则将对数据库中的外键列进行相应的更改。在下面的示例中,post实体更新为属于新的blog实体,因为其Blog导航属性设置为指向blog,blog也会插入到数据库中,因为它是已由上下文post跟踪的实体的导航属性引用的新实体。

using (var context = new BloggingContext())
{
    //新增一个主体实体
    var blog = new Blog { Url = "http://blogs.msdn.com/visualstudio" };
    var post = context.Posts.First();
    //post更新关系
    post.Blog = blog;
    context.SaveChanges();
}

4.级联删除

删除行为在DeleteBehavior枚举器类型中定义,并且可以传递到OnDelete Fluent api来控制:

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

示例:

var blog = context.Blogs.Include(b => b.Posts).First();
var posts = blog.Posts.ToList();
DumpEntities("  After loading entities:", context, blog, posts);
context.Remove(blog);
DumpEntities($"  After deleting blog '{blog.BlogId}':", context, blog, posts);
try
{
    Console.WriteLine();
    Console.WriteLine("  Saving changes:");
    context.SaveChanges();
    Dumpsql();
    DumpEntities("  After SaveChanges:", context, blog, posts);
}
catch (Exception e)
{
    DumpSql();
    Console.WriteLine();
    Console.WriteLine($"  SaveChanges threw {e.GetType().Name}: {(e is DbUpdateException ? e.InnerException.Message : e.Message)}");
}

记录结果:

After loading entities:
    Blog '1' is in state Unchanged with 2 posts referenced.
      Post '1' is in state Unchanged with FK '1' and reference to blog '1'.
      Post '2' is in state Unchanged with FK '1' and reference to blog '1'.

  After deleting blog '1':
    Blog '1' is in state Deleted with 2 posts referenced.
      Post '1' is in state Unchanged with FK '1' and reference to blog '1'.
      Post '2' is in state Unchanged with FK '1' and reference to blog '1'.

  Saving changes:
    DELETE FROM [Posts] WHERE [PostId] = 1
    DELETE FROM [Posts] WHERE [PostId] = 2
    DELETE FROM [Blogs] WHERE [BlogId] = 1

  After SaveChanges:
    Blog '1' is in state Detached with 2 posts referenced.
      Post '1' is in state Detached with FK '1' and no reference to a blog.
      Post '2' is in state Detached with FK '1' and no reference to a blog.

5.事务

事务允许以原子方式处理多个数据库操作。如果已提交事务,则所有操作都会成功应用到数据库。如果已回滚事务,则所有操作都不会应用到数据库。

5.1控制事务

可以使用DbContext.Database API开始、提交和回滚事务。以下示例显示了两个SaveChanges()操作以及正在单个事务中执行的LINQ查询。并非所有数据库提供应用程序都支持事务的。 调用事务API时,某些提供应用程序可能会引发异常或不执行任何操作。

using (var context = new BloggingContext())
{
    using (var transaction = context.Database.BeginTransaction())
    {
        try
        {
            context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
            context.SaveChanges();
            context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/visualstudio" });
            context.SaveChanges();
            var blogs = context.Blogs
                .OrderBy(b => b.Url)
                .ToList();
            // Commit transaction if all commands succeed, transaction will auto-rollback
            // when disposed if either commands fails
            transaction.Commit();
        }
        catch (Exception)
        {
            // TODO: Handle failure
        }
    }
}

到此这篇关于ASP.net core使用EF保存数据、级联删除和事务使用的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: ASP.NETCore使用EF保存数据、级联删除和事务使用

本文链接: https://lsjlt.com/news/145305.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ASP.NETCore使用EF保存数据、级联删除和事务使用
    目录1.简介2.基本保存2.1添加数据2.2更新数据2.3删除数据2.4单个SaveChanges中的多个操作3.保存关联数据3.1添加关联数据3.2添加相关实体3.3更改关系4.级...
    99+
    2024-04-02
  • mysql级联删除功能怎么使用
    这篇文章主要介绍“mysql级联删除功能怎么使用”,在日常操作中,相信很多人在mysql级联删除功能怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql级联删除功能怎么使用”的疑惑有所帮助!接下来...
    99+
    2023-07-06
  • ASP.NET Core使用EF SQLite对数据库增删改查
    目录1新建ASP.NETCoreMVC应用1.1新建MVC应用1.2引入NuGet包引入教程依赖项2新建模型和上下文2.1新建模型类2.2新建上下文步骤1步骤2步骤33配置服务1直接...
    99+
    2024-04-02
  • 如何使用phonegap克隆和删除联系人
    这篇文章将为大家详细讲解有关如何使用phonegap克隆和删除联系人,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实例如下:<!DOCTYPE html&...
    99+
    2024-04-02
  • ASP.NET Core怎么使用EF SQLite对数据库增删改查
    这篇文章将为大家详细讲解有关ASP.NET Core怎么使用EF SQLite对数据库增删改查,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1 新建ASP.NET Cor...
    99+
    2023-06-26
  • 怎么使用PHP编写修改和保存数据
    今天小编给大家分享一下怎么使用PHP编写修改和保存数据的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。连接数据库使用PHP操作...
    99+
    2023-07-05
  • 基于Spring Boot使用JpaRepository删除数据时的注意事项
    问题: 在Spring Boot中使用JpaRepository的deleteById(ID id)方法删除数据时,首先要使用existsById(ID id)方法判断数据...
    99+
    2024-04-02
  • MySQL使用binlog2sql闪回误删除数据
    查询数据库相关配置参数 root [test]> show global variables like 'binlog%for...
    99+
    2024-04-02
  • 如何使用delete语句删除数据
    这篇文章主要介绍如何使用delete语句删除数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!怎么使用delete语句删除数据?创建一个临时表,用于演示sqlserver语...
    99+
    2024-04-02
  • 使用elasticsearch定时删除索引数据
    1、有的时候我们在使用ES 由于资源有限或业务需求,我们只想保存最近一段时间的数据,所以有必要做定时删除数据。 2、编写脚本 vim del_es_by_day.sh #!/bi...
    99+
    2024-04-02
  • 怎么使用PHP删除MySQL数据库
    本篇内容主要讲解“怎么使用PHP删除MySQL数据库”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用PHP删除MySQL数据库”吧!删除一个数据库如果数据库不再需要那么它将可以被永远删除。...
    99+
    2023-06-20
  • 使用python怎么向列表增加和删除数据
    使用python怎么向列表增加和删除数据?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、使用 append 函数来为列表 list 添加数据,默认将数据追加在末尾。#&nbs...
    99+
    2023-06-15
  • 删除或者备份toad保存连接数据库的用户名和密码
    Toad版本是“Toad for Oracle 12.1”每次打开toad的时候都会有这个连接窗口,但是我的下面两个连接现在不用了,但是找不到删除选项。在本地,有    C:\Users...
    99+
    2024-04-02
  • jpa onetomany 使用级连表删除被维护表数据时的坑
    目录jpa onetomany 使用级连表删除被维护表数据时的坑一、异常产生的场景二、存在异常的问题三、异常原因分析四、解决方案jpa onetomany的用法one部分many部分...
    99+
    2024-04-02
  • PHP开发中如何使用Memcache进行高效的数据缓存和删除?
    PHP开发中如何使用Memcache进行高效的数据缓存和删除?Memcache是一款常用的内存缓存系统,它可以帮助我们在应用程序中快速存取数据。在PHP开发中,我们可以利用Memcache来进行高效的数据缓存和删除,提升应用程序的性能和响应...
    99+
    2023-11-07
    PHP Memcache 缓存删除
  • Golang如何使用ttl机制保存内存数据
    本篇内容介绍了“Golang如何使用ttl机制保存内存数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ttl(time-to-live) ...
    99+
    2023-07-05
  • Oracle使用fy_recover_data恢复truncate删除的数据
    目录前言1.创建测试表2.truncate table pak_tab3 编译fy_recover_data包4.执行fy_recover_data包5.把数据插回原表6.校验数据总结前言 TRUNCATE不会逐个清除用...
    99+
    2022-07-20
    Oracle恢复truncate删除数据 Oraclefy_recover_data
  • pt-archiver 数据删除、迁移工具使用
    1. 数据库连接参数 参数 说明 A 字符编码 D 库 F 从文件读取选项 L 加载数据本地文件 P 端口 S socket文件 a 执行查询的数据库 b 如果是t...
    99+
    2024-04-02
  • 怎么使用phpmyadmin删除数据表主键
    这篇文章给大家分享的是有关怎么使用phpmyadmin删除数据表主键的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。首先打开需要删除主键的数据库接着打开需要删除主键的数据表,点击【...
    99+
    2024-04-02
  • 使用T-SQL语句操作数据表-删除数据
    1.使用 delete 语句删除表中的数据:语法:delete from <表名> [where <删除条件>]delete 是删除的意思 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作