关于 c# EF core 框架和数据库建模的问题

2021-02-27 19:59:30 +08:00
 zxCoder

我有个问题,比如我现在有两个数据库模型,用户和比赛,一个用户可以参加多个比赛,是一对多的关系。但是一般查询用户信息不需要展示用户参加的比赛,只有特定的查询才需要。

像这种一对多关系,以往简单的情况我都是直接在 User 类里写 List<Contest>这样,然后框架会自动在数据库 Contest 表里生成对 User 的外键索引,然后查询 User 的时候也会自动把 List<Contest>查出来。

我想请问这样("一般查询用户信息不需要展示用户参加的比赛,只有特定的查询才需要")会影响查询的性能吗?(就是理论上来说,我知道这种小破项目没必要太早考虑这种东西)

2127 次点击
所在节点    .NET
7 条回复
imshawer
2021-02-27 20:03:40 +08:00
框架一般默认会帮你处理好延迟加载的问题,不放心可以跟踪一下查询。
chinvo
2021-02-27 20:12:33 +08:00
ef 不会自动查出关联数据来,除非你显式加载对应的属性
zamesking
2021-02-28 09:25:14 +08:00
正常的关联不会自动查出来,需要你现实加载通过“include". 还有一种建模如果用 owned type,会自动加载。
beginor
2021-02-28 13:54:00 +08:00
楼主的这种情况 EF 默认处理就很好了,默认就是按需加载,不会查询关联属性对应的数据,除非显示查询或者调用用到关联属性的内容,才会查询关联属性对应的数据。
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
cenbiq
2021-03-01 12:15:21 +08:00
EF Core 默认就是单表查询,如果你 Include 导航属性则会单次查询内(使用 SQL Join )加载该子表。如果你给导航属性加上 virtual 的话,仍然会默认加载单表,但调用 virtual 导航属性的 Get 访问器时会临时查询子表(懒加载,一般不建议这么干,考虑 DDD 时可能会用上)。至于关联表导航但不用外键,前几天 V2 还有个帖子有回答可以翻翻看。
Manweill
2021-03-01 17:19:10 +08:00
@cenbiq 如果没有其它特殊设置的话,是必须要在导航属性加上 virtual 才会开启懒加载。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/756797

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX