面试官:说说对EF中SaveChanges的理解?

背景 

     “没有想到会问这个问题,一般不是都问EF的优化吗?”前同事告诉我,居然面试官会问这个问题,当时就问懵了,接下来的表现就不用说了,准备下次面吧!当然大家可不能这样,一定不要被某个问题而影响全局;如果遇到非常刻薄的面试官另说,可以反其道而行之,不想浪费时间的就早撤。本文将聊聊“EF中的SaveChanges理解”这个面试题。

解答

EF中的SaveChanges方法非常重要,从表面意思就可以看出是保存状态的意思,也就最终把数据存储到数据库的时候,它直接关系到数据持久性和一致性(当有多个实体会自带事务)。官网的解释是“保留数据库的所有更新,并在对象上下文中重置更改跟踪。”我理解SaveChanges方法具有以下关键点:

1)数据提交和事务性操作:SaveChanges是将对数据上下文所做的更改保存到数据库的方法。它其实是一个事务性操作,数据要么所有更改都成功提交到数据库,要么它们都会回滚。这样保证了数据的一致性,如果在保存期间发生错误,数据库不会处于部分更改的状态。

2)更改跟踪:在EF中,对实体对象的更改首先保存在内存中的一个缓冲区中,也就是所谓的更改跟踪。当我调用SaveChanges时,EF会检查这个缓冲区,将更改保存到数据库中的相应实体。

3、异常处理:SaveChanges方法可能会引发各种异常,如数据库约束违规、连接问题等。因此,在实际应用中,需要编写相应的异常处理代码,以确保系统能够发现这些潜在问题,并记录错误日志,可以给解决错误提供帮助。

4、性能优化:EF有时会将多个更改批量提交到数据库,以提高性能。不过,根据应用程序的需求,我们可以调整EF的跟踪状态,以满足特定的性能要求。

5、返回值:SaveChanges通常返回一个整数,表示成功保存到数据库的实体数量。这代表数据是否插入成功。

SaveChanges方法执行步骤

如下图:

c2dd0e181439cd7b6677ce9545b85be7.png

1、首先是更改跟踪(Change Tracking) 当你在应用程序中对实体对象进行更改(新增、更新、删除)时,Entity Framework会使用一种称为更改跟踪的机制来跟踪这些更改。每个实体对象都有一个状态,表示它在内存中的状态,例如Added(新增)、Modified(修改)、Deleted(删除)等。

2、构建SQL语句:在调用SaveChanges方法之前,Entity Framework会分析内存中的更改跟踪信息,确定哪些实体需要插入、更新或删除。然后,它会生成相应的SQL语句来执行这些操作。没有问题后这些SQL语句会被发送到数据库以执行。

3、数据库连接和事务:Entity Framework会打开与数据库的连接,并在一个事务中执行生成的SQL语句。这一步非常关键,因为它确保了所有更改要么全部成功保存到数据库,要么全部回滚。如果有任何一个SQL语句失败,事务会回滚,以确保数据的一致性。

4、执行SQL语句:数据库管理系统会执行生成的SQL语句,将更改应用到数据库中的相应表。这包括插入新记录、更新现有记录和删除记录等操作。

5、处理异常:如果在执行SQL语句时发生异常(如唯一性约束冲突、数据完整性违规等),Entity Framework会捕获这些异常并将它们转化为.NET异常。开发人员可以选择在代码中捕获并处理这些异常,以便采取适当的措施,例如回滚事务或记录错误。

6、最后是返回结果:SaveChanges方法通常会返回一个整数,表示成功保存到数据库的实体数量。这个值对于了解操作的成功与否以及影响的行数非常有用。

结语

本文从求职者的角度解答了“对EF中SaveChanges的理解”,并介绍了SaveChanges的执行流程。一般面试考EF优化的比较多,单纯"SaveChanges"关键字还是比较少见。希望本文对你面试有所帮助。同时欢迎留言讲讲你对SaveChanges的理解,以及你遇到过那些欺骗面试题。

参考:

learn.microsoft.com/zh-cn/dotnet/api/system.data.entity.core.objects.objectcontext.savechanges

版权声明:本文来源于网友收集或网友供稿,仅供学习交流之用,如果有侵权,请转告小编或者留言,本公众号立即删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值