V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zxCoder
V2EX  ›  .NET

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

  •  
  •   zxCoder · 2021-02-27 19:59:30 +08:00 · 2271 次点击
    这是一个创建于 1372 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    7 条回复    2021-03-01 17:19:10 +08:00
    imshawer
        1
    imshawer  
       2021-02-27 20:03:40 +08:00
    框架一般默认会帮你处理好延迟加载的问题,不放心可以跟踪一下查询。
    chinvo
        2
    chinvo  
       2021-02-27 20:12:33 +08:00 via iPhone
    ef 不会自动查出关联数据来,除非你显式加载对应的属性
    zamesking
        3
    zamesking  
       2021-02-28 09:25:14 +08:00
    正常的关联不会自动查出来,需要你现实加载通过“include". 还有一种建模如果用 owned type,会自动加载。
    beginor
        4
    beginor  
       2021-02-28 13:54:00 +08:00 via Android
    楼主的这种情况 EF 默认处理就很好了,默认就是按需加载,不会查询关联属性对应的数据,除非显示查询或者调用用到关联属性的内容,才会查询关联属性对应的数据。
    Manweill
        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
    cenbiq
        6
    cenbiq  
       2021-03-01 12:15:21 +08:00
    EF Core 默认就是单表查询,如果你 Include 导航属性则会单次查询内(使用 SQL Join )加载该子表。如果你给导航属性加上 virtual 的话,仍然会默认加载单表,但调用 virtual 导航属性的 Get 访问器时会临时查询子表(懒加载,一般不建议这么干,考虑 DDD 时可能会用上)。至于关联表导航但不用外键,前几天 V2 还有个帖子有回答可以翻翻看。
    Manweill
        7
    Manweill  
       2021-03-01 17:19:10 +08:00
    @cenbiq 如果没有其它特殊设置的话,是必须要在导航属性加上 virtual 才会开启懒加载。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2515 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 02:42 · PVG 10:42 · LAX 18:42 · JFK 21:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.