我可以阻止Entity Framework Core使用部分数据填充结果吗?
问题描述:
在实体框架核心文档的this page,它加载查询数据时说:我可以阻止Entity Framework Core使用部分数据填充结果吗?
实体框架的核心会自动修复式导航性能,以先前加载到上下文实例任何其他实体。因此,即使您没有明确包含导航属性的数据,如果先前加载了一些或所有相关实体,该属性仍可能被填充。
这是真实的它是否是渴望或明确。
我觉得这很令人沮丧,因为它会返回部分数据,这使得它看起来像一个完整的列表,因为没有任何数据表明它是部分的。
例子:
说我有以下两类:
class User {
int Id { get; set; }
string Name { get; set; }
List<Message> Messages { get; set; }
}
class Message {
int Id { get; set; }
List<User> Users{ get; set; }
}
我查询使用下面的代码:
_dbContext.Users
.Include(u => u.Messages)
.Single(u => u.Id == 1);
我的输出如下:
"user" {
"id": 1,
"name": "Alice",
"messages": [
{
"id": 1,
"users": [
{
"id": 1,
"name": "Alice",
}
]
}
]
}
我认为,除非我也加了.ThenInclude(m => m.Users)
,它会给我一个空或空列表,而不是一个部分列表。
答
我从你的例子中假设,爱丽丝的ID为1的消息被链接到更多的一个用户(她自己)。
我不确定是否需要更改此行为。正如你所提到的,如果我们需要导航属性被完全初始化,我们应该使用.ThenInclude(m => m.Users)
。
我预计,除非我还添加了.ThenInclude(M => m.Users),它 会给我一个空或空列表,而不是部分列表。
当执行延迟加载时,部分结果将是一件好事。如果您要访问的导航属性已经加载,那么您将保存到数据库的往返行程。
[如何防止EF7急切修复导航属性?](http://*.com/questions/35438600/how-can-i-prevent-ef7-from-eagerly-fixing-up - 导航属性) – Romoku
@Romoku我真的不知道这将是如何重复的问题。 – bdrelling