我可以阻止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),它会给我一个空或空列表,而不是一个部分列表。

+1

[如何防止EF7急切修复导航属性?](http://*.com/questions/35438600/how-can-i-prevent-ef7-from-eagerly-fixing-up - 导航属性) – Romoku

+0

@Romoku我真的不知道这将是如何重复的问题。 – bdrelling

我从你的例子中假设,爱丽丝的ID为1的消息被链接到更多的一个用户(她自己)。

我不确定是否需要更改此行为。正如你所提到的,如果我们需要导航属性被完全初始化,我们应该使用.ThenInclude(m => m.Users)

我预计,除非我还添加了.ThenInclude(M => m.Users),它 会给我一个空或空列表,而不是部分列表。

当执行延迟加载时,部分结果将是一件好事。如果您要访问的导航属性已经加载,那么您将保存到数据库的往返行程。