这不是您的配置问题,而是您查询数据的方式的问题。您应该手动包含您正在寻找的关系记录/导航属性:
var externalSystems = myDatabaseContext
.ExternalSystem
.Include(es => es.ExternalSystemRules)
.ToList();
不过,我建议不要使用自动包含(*)。虽然这似乎没有什么区别,但当您有数十或数百个对象需要查询时,一旦数据集增长,性能就会迅速下降。每次你查询一个集合时AutoInclude
启用后,无论您是否需要,您都将获得其所有导航属性。此外,这也适用于从该实体派生的所有实体类型。如果您决定无论如何使用它,您可以通过使用禁用它来进行单个查询.IgnoreAutoIncludes()
.
两种方法共有的问题(Include()
, 也AutoInclude()
) 是层次结构。它们适用于非常简单的模型,但是一旦您尝试映射层次结构 - 想象一下类似树的东西,其中规则可以具有相同类型的子规则,您可能会遇到自引用循环的问题,并且需要手动投影。
这里有一篇很好的文章解释了这个问题:https://khalidabuhakmeh.com/ef-core-and-aspnet-core-cycle-issue-and-solution https://khalidabuhakmeh.com/ef-core-and-aspnet-core-cycle-issue-and-solution
查询数据的更好方法是使用“视图模型”,以避免将未使用或敏感的数据返回给客户。
public class ExternalSytemVm
{
public int Id {get; set;}
public IEnumerable<ExternalSystemRulesVm> Rules {get; set;}
/* ...*/
}
public class ExternalSytemRulesVm
{
public int Id {get; set;}
public string Name {get; set;}
/* ...*/
}
var externalSystems = myDatabaseContext
.ExternalSystem
.Select(es => new ExternalSystemVm {
Id = es.Id
Rules = es.ExternalSystemRules.Select(esr => {
/* ... */
})
})
.ToList();
(*)如果您绝对确定您始终需要所有属性,以及应用程序中每个查询中的所有导航属性,那么这可能没问题。
文档:https://learn.microsoft.com/en-us/ef/core/querying/lated-data/eager https://learn.microsoft.com/en-us/ef/core/querying/related-data/eager