EntityFrameworkCore使用起来和我想象中不一样

中文命名法 2021-05-20 01:00:09
我的程序运行的时候要保存一些纪录,数据量是很小的。
我的愿望是程序运行时加载一下数据库,把所有数据都取出来放在内存里。
这样我在程序运行中对内存中数据进行修改的时候,被ef检测到,
当我SaveChanges()时,向数据库更新发生改变的数据。

但是,在我使用 .First() 定位数据的时候,发现程序还是去访问了数据库。
这次访问我觉得完全是多余的,因为数据在内存里面有。
能否按照我上面描述的用法使用EntityFrameworkCore?

即,只读取一次,数据改变时,保存。
查找数据时不要再访问数据库了,因为内存里有数据。
...全文
21606 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
exception92 2021-05-26
  • 打赏
  • 举报
回复
引用 4 楼 中文命名方式倡导者 的回复:
[quote=引用 3 楼 exception92 的回复:]把所有数据都取出来放在内存里 ->都取出来这种方式是不建议用的。放到内存里的操作是ToList操作吧,而非返回的IQueryable接口
这样的话,数据赋值的时候要做2遍,而且赋值定位纪录的时候,还需要访问数据库做查询。我的数据量很小,全部取出之后做跟踪,是做不到吗?[/quote] -》数据赋值2遍不知道是什么逻辑。 -》默认全部取出来的数据状态是被跟踪状态的,除非使用AsNoTracking手动设置非跟踪状态。对跟踪状态的实体进行修改,EF的状态跟踪器会记录更新的实体字段,在savechanged的时候生成更新语句。你用Find方法替代first方法,在使用find方法时实体必须要有主键。
HttpCookie 2021-05-21
  • 打赏
  • 举报
回复
你可以把数据全部加载到内存中,直接监听如果数据有变化就去修改数据,如果你是想随时去修改那相当于ef的链接一直存在也消耗资源啊 ,还不如监听数据如果有修改则去修改数据库中的数据
Eason0807 2021-05-20
  • 打赏
  • 举报
回复
引用 5 楼 中文命名方式倡导者 的回复:
数据库的查询结果转List我知道,只要ToList()就行了。 那我内存中的这个List经过修改后,还能变回去,再去更新数据库吗?
这个要看是怎么折腾这个list的了,如果导致其变成了断开连接的实体就造成你描述的问题 官方文档上有相关描述
中文命名法 2021-05-20
  • 打赏
  • 举报
回复
数据库的查询结果转List我知道,只要ToList()就行了。 那我内存中的这个List经过修改后,还能变回去,再去更新数据库吗?
中文命名法 2021-05-20
  • 打赏
  • 举报
回复
引用 3 楼 exception92 的回复:
把所有数据都取出来放在内存里 ->都取出来这种方式是不建议用的。放到内存里的操作是ToList操作吧,而非返回的IQueryable接口
这样的话,数据赋值的时候要做2遍,而且赋值定位纪录的时候,还需要访问数据库做查询。我的数据量很小,全部取出之后做跟踪,是做不到吗?
exception92 2021-05-20
  • 打赏
  • 举报
回复
把所有数据都取出来放在内存里 ->都取出来这种方式是不建议用的。放到内存里的操作是ToList操作吧,而非返回的IQueryable接口
中文命名法 2021-05-20
  • 打赏
  • 举报
回复
引用 1 楼 楠小南 的回复:
哈,上次有个贴说 怎么老是读缓存,怎么才能每次都读数据库,这个贴就跟那次的是相反的,你应该考虑一下 数据是否有 跟踪,或者EF上下文的 生命周期
可否具体。我只需要它读一次数据库,剩下全部读缓存,干跟踪的活。
楠小南 2021-05-20
  • 打赏
  • 举报
回复
哈,上次有个贴说 怎么老是读缓存,怎么才能每次都读数据库, 这个贴就跟那次的是相反的, 你应该考虑一下 数据是否有 跟踪,或者EF上下文的 生命周期

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧