我可以阻止Entity Framework Core使用部分数据填充我的结果吗?
在Entity Framework Core文档的这个页面上,它说当查询加载的数据时:
entity framework核心将自动将导航属性修复为先前加载到上下文实例中的任何其他实体。 因此,即使您没有明确包含导航属性的数据,如果之前加载了部分或全部相关实体,仍可能会填充该属性。
无论是Eager还是Explicit都是如此。
我觉得这很令人沮丧,因为它会返回部分数据,这使得它看起来像一个完整的列表,因为没有任何迹象表明它是部分的。
例:
说我有以下两个类:
class User { int Id { get; set; } string Name { get; set; } List Messages { get; set; } } class Message { int Id { get; set; } List 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)
,它会给我一个空列表或空列表,而不是部分列表。
我假设从你的例子中,Alice的id为1的消息链接到一个用户(她自己)。
我不确定是否有必要改变这种行为 。 正如您所提到的,如果我们需要完全初始化导航属性,我们应该使用.ThenInclude(m => m.Users)
。
我希望除非我也添加.ThenInclude(m => m.Users),它会给我一个空列表或空列表,而不是部分列表。
当实现延迟加载时,部分结果将是一件好事 。 如果您要访问的导航属性已加载,则您将保存到数据库的往返。