请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

项目重构异步模式那节为什么没有把Add和Delete改成异步模式?后面视频里没看到有解释

项目重构异步模式那节为什么没有把Add和Delete改成异步模式?后面视频里没看到有解释

正在回答 回答被采纳积分+3

1回答

阿莱克斯刘 2020-10-10 15:52:55

谢谢你提出的问题,前几天我跑出去旅游了,回答延误了,不好意思。由于视频剪辑的失误,add和delete这两个操作的异步解释不小心删除了,视频的勘误我会尽快完成。不过请不用担心,完全不会影响接下来的学习。

我们使用的orm框架是entity framework core,在旧版的ef框架中add添加与remove删除都没有对应的异步接口,也就是说没有AddAsync与RemoveAsync。

不过,自从ef6开始,数据的添加操作也有异步操作了,AddAsync函数也有了,我们使用的ef是最新版,所以add添加也将会支持异步操作,接下来的课程都会支持add与delete的异步操作。

下面简单聊一下为什么没有remove的异步操作。

  • 与数据库的读取数据操作不一样(比如GetTouristRoutesAsync函数),不管是add还是remove都不会在被调用后直接向数据库写入数据,而是先把数据放在DbContext中,由一个叫做“ChangeTracker”的东西管理(暂时理解为内存),直到调用 _context.SaveChangesAsync()以后,数据才会被真正写入数据库中。

    数据存入ChangeTracker(DbContext)的时候进行的是内存操作,并不是真正的IO操作,所有没有必要进行异步操作,这就是为什么add与delete不需要对应的异步函数。

那么,为什么最新版的ef又提供了add的异步操作AddAsync呢?

  • 因为,有时候在添加数据的时候,可能会需要与数据库提前沟通一下,比如说如果一个模型的主键id,是整数类型、而且是由数据库控制的自增数字,那么我们在添加数据的时候必须得先问问数据库这个新数据的id是什么啊,得到id以后再把数据存入ChangeTracker里面,最后,直到调用 _context.SaveChangesAsync()以后,数据才会被真正写入数据库中。而问数据库取得id的过程实际上就是一个IO操作,既然是IO,那么异步操作就在所难免了,这就是为什么新版的ef加入了AddAsync这个函数,提供了这个异步操作。

如果哪里没讲明白请继续提问,谢谢。


2 回复 有任何疑惑可以回复我~
  • 为什么最新版的ef又提供了add的异步操作AddAsync呢?老师对这个问题的解释,我不太理解,添加新的数据,主键自增的话,是先从数据库取到最新的主键+1,再把这个包含主键的对象放到内存中,再执行保存动作。还是说,主键由数据库来生成,程序员写入的数据不包含主键呢?非常感谢老师的回复!
    回复 有任何疑惑可以回复我~ 2022-10-08 18:27:19
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信