【问题标题】:Database optimization - Entity Framework Foreign Key attribute数据库优化 - 实体框架外键属性
【发布时间】:2015-01-21 13:45:07
【问题描述】:

我有一个包含几个外键属性的表,这些属性从 Identity Provider 2.0 转到 Users 表。

    [ForeignKey("IsApprovedBy")]
    public ApplicationUser IsApprovedByUser { get; set; }
    public string IsApprovedBy { get; set; }

这不是问题本身,虽然我知道规范化它应该可以使我不会 nead 这个外键。

我遇到的问题是,当我获取数据并将其返回到我的前端时,Entity 框架调用数据库 3 次只是为了填写这些 ApplicationUser,而不是在我的调用中执行。

Db.Contractors.Include(x => x.IsApprovedByUser)

为什么他在返回我的值而不是在执行我的查询时调用数据库来获取这个特定的数据(所有其他数据已经加载)?

在此先感谢您。

跟踪捕获:

【问题讨论】:

  • 在 EF 中看起来像延迟加载问题。尝试在 DbContext 中禁用延迟加载并再次检查。
  • 这似乎确实有效,我现在唯一的问题是我的一些测试使用 Indentity 提供程序的 UsersRoles 表失败。这很奇怪,延迟加载它可以工作,没有它就不行。有什么注意事项吗?
  • 因为默认情况下 Identity 不会获取您的子对象,并且您将在所有从 ApplicationUser 挂起的导航属性上获得 NullReferenceExceptions。一般来说,关闭延迟加载会更好——这将避免 EF 对你的疯狂。
  • 将此作为答案发布,以便我接受。感谢您的努力!

标签: sql entity-framework asp.net-identity-2


【解决方案1】:

这是来自 DbContext 的延迟加载问题,而不是来自 Identity。默认情况下,当您加载 ApplicationUserApplicationRole 时,Identity 不包括子对象。

如果您关闭延迟加载,对 DB 的多个请求的问题将消失,但 ApplicationUser 的子对象将为空值。如果您关心数据库请求的数量和数据库性能,最好禁用延迟加载。但是您必须单独解决加载子对象的问题。

【讨论】:

    猜你喜欢
    • 2012-11-15
    • 2010-10-03
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    相关资源
    最近更新 更多