Sql 数据库优化-实体框架外键属性

Sql 数据库优化-实体框架外键属性,sql,entity-framework,asp.net-identity-2,Sql,Entity Framework,Asp.net Identity 2,我从Identity Provider 2.0中获得了一个包含几个foreignkey属性的表,这些属性将转到Users表 [ForeignKey("IsApprovedBy")] public ApplicationUser IsApprovedByUser { get; set; } public string IsApprovedBy { get; set; } 这不是问题本身,但我知道将其正常化应该使其正常化,这样我就不会整理这个外键 我遇到的问题是,当我获取数

我从Identity Provider 2.0中获得了一个包含几个foreignkey属性的表,这些属性将转到
Users

    [ForeignKey("IsApprovedBy")]
    public ApplicationUser IsApprovedByUser { get; set; }
    public string IsApprovedBy { get; set; }
这不是问题本身,但我知道将其正常化应该使其正常化,这样我就不会整理这个外键

我遇到的问题是,当我获取数据并将其返回到前端时,Entity framework会调用数据库3次,只是为了填充这些应用程序用户,而不是在我调用时执行

Db.Contractors.Include(x => x.IsApprovedByUser)
为什么他在返回我的值时调用数据库来获取这个特定的数据(所有其他数据都已加载),而不是在执行我的查询时

提前谢谢你


跟踪捕获:

这是一个从DbContext而不是从Identity延迟加载的问题。默认情况下,在加载
ApplicationUser
ApplicationRole
时,标识不包括子对象


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

看起来像EF中的延迟加载问题。尝试禁用DbContext中的延迟加载并再次检查。这似乎确实可行。我现在唯一的问题是,使用身份验证提供程序的
用户
角色
表,我的一些测试失败。这很奇怪,懒洋洋的工作,没有它就不行。这有什么问题吗?因为默认情况下Identity不会获取子对象,并且您会在
ApplicationUser
挂起的所有导航属性上获得NullReferenceException。通常情况下,你会更好地关闭懒惰加载-这将避免疯狂的EF可以在你身上。张贴这作为一个答案,所以我可以接受。谢谢你的努力!