数据库优化 - Entity Framework 外键属性
Database optimization - Entity Framework Foreign Key attribute
我有一个 table 包含几个外键属性,从身份提供者 2.0 转到 Users
table。
[ForeignKey("IsApprovedBy")]
public ApplicationUser IsApprovedByUser { get; set; }
public string IsApprovedBy { get; set; }
这本身不是问题,但我知道对其进行规范化应该可以解决这个问题,这样我就不需要这个外键了。
我确实遇到的问题是,当我获取数据并将其 return 发送到我的前端时,Entity framework 调用数据库 3 次只是为了填写这些 ApplicationUsers 而不是在我的打电话。
Db.Contractors.Include(x => x.IsApprovedByUser)
为什么他在 return 使用我的值而不是在执行我的查询时调用数据库来获取此特定数据(所有其他数据都已加载)?
提前致谢。
跟踪捕获:
这是来自 DbContext 而不是来自 Identity 的延迟加载的问题。默认情况下,当您加载 ApplicationUser
或 ApplicationRole
时,Identity 不包含子对象。
如果关闭延迟加载,多次请求数据库的问题将会消失,但 ApplicationUser
的子对象将出现空值。如果您关心数据库请求的数量和数据库性能,则最好禁用延迟加载。但是您必须解决单独加载子对象的问题。
我有一个 table 包含几个外键属性,从身份提供者 2.0 转到 Users
table。
[ForeignKey("IsApprovedBy")]
public ApplicationUser IsApprovedByUser { get; set; }
public string IsApprovedBy { get; set; }
这本身不是问题,但我知道对其进行规范化应该可以解决这个问题,这样我就不需要这个外键了。
我确实遇到的问题是,当我获取数据并将其 return 发送到我的前端时,Entity framework 调用数据库 3 次只是为了填写这些 ApplicationUsers 而不是在我的打电话。
Db.Contractors.Include(x => x.IsApprovedByUser)
为什么他在 return 使用我的值而不是在执行我的查询时调用数据库来获取此特定数据(所有其他数据都已加载)?
提前致谢。
跟踪捕获:
这是来自 DbContext 而不是来自 Identity 的延迟加载的问题。默认情况下,当您加载 ApplicationUser
或 ApplicationRole
时,Identity 不包含子对象。
如果关闭延迟加载,多次请求数据库的问题将会消失,但 ApplicationUser
的子对象将出现空值。如果您关心数据库请求的数量和数据库性能,则最好禁用延迟加载。但是您必须解决单独加载子对象的问题。