我使用InMemoryDatabase
进行了以下EF 3.0查询:
IQueryable<Post> posts = _context.Posts.AsNoTracking();
posts = posts.Where(x => x.Enabled);
IQueryable<PostModel> models = null;
try {
models = jobs
.Select(x => new PostModel {
Id = x.Id,
Enabled = x.Enabled,
Category = x.Category == null ? null : new CategoryModel {
Id = x.Category.Id,
Name = x.Category.Name
}
);
var result = await responses.ToListAsync();
} catch (Exception e) {
var ex = e;
}
最初posts
有2个项目。在过滤器Where(x => x.Enabled)
之后,我得到了一项。
但是result
末尾没有项目……似乎现有项目在投影中消失了。
然后我尝试了以下操作(已删除“类别”部分):
models = jobs
.Select(x => new PostModel {
Id = x.Id,
Enabled = x.Enabled
);
var result = await responses.ToListAsync();
现在结果有一个预期的项目...
有什么主意吗?我真的迷失了这个。
答案 0 :(得分:0)
这个问题很难识别,我正在发布解决方案,该解决方案将来可能对其他人有用...
在Post
模型配置Category
中,属性/关系设置为必需。
当我向context
添加帖子时,其中一个错误地将Category
设置为null
。
如果我使用的是SQL Server,则在保存上下文时会出现错误。
但是因为我正在执行测试并且正在使用InMemoryDatabase,所以接受了无效的帖子。
这导致了查询中真正奇怪的错误...
结论:
在EF 3.0(及更低版本)中,该模型未在C#级别进行验证。
因此,在使用InMemoryDatabase时,将保存错误的模型,并导致查询中发生意外错误。
Entity Framework Core 3.0中还有一个Github问题: https://github.com/aspnet/EntityFrameworkCore/issues/10613