【发布时间】:2022-01-11 21:24:36
【问题描述】:
我正在尝试将软删除改造为使用 EF Core 的 ASP.NET Core 5.0 应用程序。
在DbContext的OnModelCreating方法中是这样完成的:
builder.Entity<MyEntity>().Property<bool>("IsDeleted");
builder.Entity<MyEntity>().HasQueryFilter(m => EF.Property<bool>(m, "IsDeleted") == false);
这是在docs 中推荐的。我希望避免更改底层数据库实体(如MyEntity)。
异常是在这样的代码上引发的,它曾经完美地工作:
var myEntities= _context.MyEntities.AsNoTracking();
return _mapper.Map<IEnumerable<MyEntity>>(myEntities);
导致(在第二行):
InvalidOperationException: The LINQ expression 'DbSet<MyEntity>()
.Where(s => EF.Property<bool>(s, __ef_filter___isDeleted_0) == False)' could not be translated.
因为(自然)有很多地方使用 AutoMapper,所以我也不想更改用于返回我的 DTO 的代码。调整 AutoMapper 配置就可以了。
PostgreSQL 被用作底层数据库,如果这有什么不同的话。
我需要如何配置我的查询过滤器,以便现有代码不会引发异常?
// 编辑:
我已经简化了我的示例,确切的代码使用字符串作为属性名称:
private readonly string _isDeleted = "IsDeleted";
builder.Entity<MyEntity>().Property<bool>(_isDeleted);
builder.Entity<MyEntity>().HasQueryFilter(m => EF.Property<bool>(m, _isDeleted) == false);
我可以改变那个变量。
【问题讨论】:
-
它是否有效
_context.MyEntities.AsNoTracking().ToList()? -
@SvyatoslavDanyliv 不,如果我添加这个,则会抛出相同的错误,就在第一行(我添加了
.ToList()) -
所以不是 Automapper 的问题。是否启用了任何扩展?喜欢 LINQKit?
-
看起来您的示例具有误导性,因为异常消息的
__ef_filter___isDeleted_0部分表明您不使用EF.Property<bool>(m, "IsDeleted"),而是使用EF.Property<bool>(m, isDeleted)where @987654334 @ 是一些捕获的变量(类字段)。请确保提供重现问题的确切代码。 -
@IvanStoev 我已经用确切的代码编辑了我的问题
标签: c# linq entity-framework-core automapper