使用 InMemoryDatabase 时出现意外的查询异常
Unexpected query exception when using InMemoryDatabase
我有以下使用 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();
现在结果有一项符合预期...
知道哪里出了问题吗?我真的迷失了这一点。
这个问题很难确定,我正在 post 解决方案,将来可能对其他人有用...
在Post
模型配置中Category
属性/关系设置为必需.
当我将 post 添加到 context
时,其中一个 Category
错误地设置为 null
。
如果我使用的是 SQL 服务器,我会在保存上下文时遇到错误。
但是因为我正在进行测试并且我使用的是 InMemoryDatabase,所以接受了无效的 post。
这导致了查询中非常奇怪的错误...
结论:
在 EF 3.0(和以前的版本)中,模型未在 C# 级别进行验证。
因此,当使用 InMemoryDatabase 时,错误的模型将被保存并导致查询中出现意外错误。
Entity Framework Core 3.0 中也存在 Github 问题:
https://github.com/aspnet/EntityFrameworkCore/issues/10613
我有以下使用 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();
现在结果有一项符合预期...
知道哪里出了问题吗?我真的迷失了这一点。
这个问题很难确定,我正在 post 解决方案,将来可能对其他人有用...
在Post
模型配置中Category
属性/关系设置为必需.
当我将 post 添加到 context
时,其中一个 Category
错误地设置为 null
。
如果我使用的是 SQL 服务器,我会在保存上下文时遇到错误。
但是因为我正在进行测试并且我使用的是 InMemoryDatabase,所以接受了无效的 post。
这导致了查询中非常奇怪的错误...
结论:
在 EF 3.0(和以前的版本)中,模型未在 C# 级别进行验证。
因此,当使用 InMemoryDatabase 时,错误的模型将被保存并导致查询中出现意外错误。
Entity Framework Core 3.0 中也存在 Github 问题: https://github.com/aspnet/EntityFrameworkCore/issues/10613