我有个问题,比如我现在有两个数据库模型,用户和比赛,一个用户可以参加多个比赛,是一对多的关系。但是一般查询用户信息不需要展示用户参加的比赛,只有特定的查询才需要。
像这种一对多关系,以往简单的情况我都是直接在 User 类里写 List<Contest>这样,然后框架会自动在数据库 Contest 表里生成对 User 的外键索引,然后查询 User 的时候也会自动把 List<Contest>查出来。
我想请问这样("一般查询用户信息不需要展示用户参加的比赛,只有特定的查询才需要")会影响查询的性能吗?(就是理论上来说,我知道这种小破项目没必要太早考虑这种东西)
1
imshawer 2021-02-27 20:03:40 +08:00
框架一般默认会帮你处理好延迟加载的问题,不放心可以跟踪一下查询。
|
2
chinvo 2021-02-27 20:12:33 +08:00 via iPhone
ef 不会自动查出关联数据来,除非你显式加载对应的属性
|
3
zamesking 2021-02-28 09:25:14 +08:00
正常的关联不会自动查出来,需要你现实加载通过“include". 还有一种建模如果用 owned type,会自动加载。
|
4
beginor 2021-02-28 13:54:00 +08:00 via Android
楼主的这种情况 EF 默认处理就很好了,默认就是按需加载,不会查询关联属性对应的数据,除非显示查询或者调用用到关联属性的内容,才会查询关联属性对应的数据。
|
5
Manweill 2021-03-01 08:29:14 +08:00
在导航属性前面加上 virtual 关键字,就会在查询的时候默认不加载,只有通过 include 方法加载。例如,public virtual ICollection<Post> Posts { get; set; }
原文链接 https://docs.microsoft.com/en-us/ef/core/querying/related-data/lazy |
6
cenbiq 2021-03-01 12:15:21 +08:00
EF Core 默认就是单表查询,如果你 Include 导航属性则会单次查询内(使用 SQL Join )加载该子表。如果你给导航属性加上 virtual 的话,仍然会默认加载单表,但调用 virtual 导航属性的 Get 访问器时会临时查询子表(懒加载,一般不建议这么干,考虑 DDD 时可能会用上)。至于关联表导航但不用外键,前几天 V2 还有个帖子有回答可以翻翻看。
|