【问题标题】:Loading navigation properties on derived class in EF在 EF 中的派生类上加载导航属性
【发布时间】:2016-06-25 04:29:25
【问题描述】:

我正在开发一个社交媒体网站,我们正在开发 Facebook 风格的通知系统

问题是我们有一个 Notification 基类,并且有许多不同的派生通知类,如 MentionNotification、LikeNotification。

这个派生类很多时候都有自己的导航属性,所以我们必须更改 NotificationRepository 以包含所有这些新的导航属性,

我找不到避免修改基础存储库避免 N+1 查询的方法。

欢迎任何想法

【问题讨论】:

    标签: entity-framework software-design


    【解决方案1】:

    如果您使用的是Table Per Type...那么...

    public class MyContext : DbContext
    {
      public virtual DbSet<NotificationBase> Notifications { get; set; }
    }
    
    var mns = await MyContext.Notifications
      .OfType<MentionNotification>()
      .Include(mn => mn.SomeProperty)
      .ToListAsync();
    

    (在我的脑海中,我确定它是这样的......)

    【讨论】:

    • idea es 设计的东西不需要每次我需要向系统添加新的通知类型时更改通知存储库库。它会加载每个通知及其导航属性。对 notificationRepository.All() 的调用会返回系统中的所有通知,并加载其导航属性。如果我添加一个带有新类型通知的新项目,我仍然可以调用 notificationRepository.All() 并且也会返回新类型。
    • 我不认为它必须在一个查询中完成,因为生成的查询可能非常耗时,我们仍然可以得到超时,但可以更智能地加载类型的通知并进行联合,尽管这里最坏的情况是 N+1。只是玩不同的想法来解决这个问题
    • 如果超时,听起来您遇到了Cartesian Product 问题。
    • idea es 设计的东西不需要每次我需要向系统添加新的通知类型时更改通知存储库基础 - 我不建议使用实体框架,你失去了很多非常酷的功能,但是each to their own
    • 感谢您的想法,我认为最好的方法是将我的数据非规范化,并且必须处理避免层次结构的问题
    猜你喜欢
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多