- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我创建了一个界面来尝试执行软删除,混合影子属性和查询过滤器。但它不起作用。
public interface IDeletableEntity {}
然后在我的模型构建器中
builder.Model.GetEntityTypes()
.Where(entityType => typeof(IDeletableEntity).IsAssignableFrom(entityType.ClrType))
.ToList()
.ForEach(entityType =>
{
builder.Entity(entityType.ClrType).Property<Boolean>("IsDeleted");
builder.Entity(entityType.ClrType).HasQueryFilter(e => EF.Property<Boolean>(e, "IsDeleted") == false);
});
但是带有查询过滤器的行没有编译。我得到的错误是“无法将 lambda 表达式转换为类型‘lambda 表达式’,因为它不是委托(delegate)类型”
如果我这样做,它就会起作用。
builder.Entity<MyEntity>().HasQueryFilter(m => EF.Property<Boolean>(m, "IsDeleted") == false);
有什么办法可以做到这一点?这是为了与 IDeletableEntity 有一个接口(interface),而不是必须这样做,在我想使用软删除实体的每个实体中
非常感谢,
最佳答案
HasQueryFilter
非通用的 EntityTypeBuilder
(与通用的 EntityTypeBuilder<TEntity>
相反)几乎无法使用,因为没有简单的方法来创建预期的 LambdaExpression
.
一种解决方案是使用 Expression
手动构建 lambda 表达式类方法:
.ForEach(entityType =>
{
builder.Entity(entityType.ClrType).Property<Boolean>("IsDeleted");
var parameter = Expression.Parameter(entityType.ClrType, "e");
var body = Expression.Equal(
Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(bool) }, parameter, Expression.Constant("IsDeleted")),
Expression.Constant(false));
builder.Entity(entityType.ClrType).HasQueryFilter(Expression.Lambda(body, parameter));
});
另一种是使用原型(prototype)表达式
Expression<Func<object, bool>> filter =
e => EF.Property<bool>(e, "IsDeleted") == false;
并使用参数替换器将参数与实际类型绑定(bind):
.ForEach(entityType =>
{
builder.Entity(entityType.ClrType).Property<Boolean>("IsDeleted");
var parameter = Expression.Parameter(entityType.ClrType, "e");
var body = filter.Body.ReplaceParameter(filter.Parameters[0], parameter);
builder.Entity(entityType.ClrType).HasQueryFilter(Expression.Lambda(body, parameter));
});
哪里ReplaceParameter
是我用于表达式树操作的自定义辅助扩展方法之一:
public static partial class ExpressionUtils
{
public static Expression ReplaceParameter(this Expression expr, ParameterExpression source, Expression target) =>
new ParameterReplacer { Source = source, Target = target }.Visit(expr);
class ParameterReplacer : System.Linq.Expressions.ExpressionVisitor
{
public ParameterExpression Source;
public Expression Target;
protected override Expression VisitParameter(ParameterExpression node) => node == Source ? Target : node;
}
}
但在我看来,最自然的解决方案是将配置代码移动到通用方法中并通过反射调用它。例如:
static void ConfigureSoftDelete<T>(ModelBuilder builder)
where T : class, IDeletableEntity
{
builder.Entity<T>().Property<Boolean>("IsDeleted");
builder.Entity<T>().HasQueryFilter(e => EF.Property<bool>(e, "IsDeleted") == false);
}
然后
.ForEach(entityType => GetType()
.GetMethod(nameof(ConfigureSoftDelete), BindingFlags.NonPublic | BindingFlags.Static)
.MakeGenericMethod(entityType.ClrType)
.Invoke(null, new object[] { builder })
);
关于c# - EF 核心 : Soft delete with shadow properties and query filters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47673524/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
最近我看到这篇文章,它对 Jenkins 进行 GC 调优,其中讨论了这个参数:-XX:SoftRefLRUPolicyMSPerMB https://jenkins.io/blog/2016/11/
我在跑 means2来自 scipy,虽然我收到一条错误消息: /usr/lib/python2.7/dist-packages/scipy/cluster/vq.py:600: UserWarnin
环境为ubuntu 16.04 64bit,go版本go1.12 linux/amd64 我正在尝试将我的 golang 项目从 gopath 切换到 gomodule。我项目导入的包之一是使用cgo
urplus(多余) wave(浪) Get lost (迷路) nature(本性) Rely on 依赖 Soft cancer (软癌) Devour.(吞噬) ink into
我正在尝试安装 openal-soft在 Ubuntu Focal 上,但没有运气。 这是我要安装的软件包: https://packages.ubuntu.com/source/focal/open
ln -s /dir1/file1 /dir2/file1 我想在目标 dir1 中创建一个与 dir2 中的源文件名相同的软链接(soft link) 如何在目标路径中不输入 file1 名称的
我目前正在研究调试器。我读到调试器有软件断点(apparently 这些是最常用的断点)。这些通过将操作码的第一个字节替换为 Int 3(操作码 0xcc)来工作。 我已经读过程序的文本(/code)
根据 keyword module 的文档,Python 3.9 中添加了两个新成员: issoftkeyword softkwlist 然而,他们的文档并未透露任何有关其目的的信息。在What's
我正在使用 OpenAL-Soft对于一个项目,现在我正在尝试决定是否需要实现 OpenAL 源池。 源池有些麻烦(我需要编写代码来“分配”源,以及以某种方式决定何时可以“释放”它们),但如果 Ope
当我说“软”事务时,我的意思是不涉及某些数据库中的持久性,而只是逻辑对象修改。故事是这样的。 普通的 JAVA 应用程序,没有框架,可能有很多线程。 对象Ob在其单独的线程中启动doSomething
我有几百个由不同工具生成的数据库,并存档在一个中心区域。所有文件都以压缩格式存储。我尝试通过在 var 目录中创建软链接(soft link)将这些数据库导入 mysql 服务器,但我在 mysql
在 Linux 中,我如何找到链接到特定目标目录或文件的所有软链接(soft link)? 最佳答案 您可以使用find 的-lname 参数: find . -lname linktarget 关于
创建了名为D1的目录,并在同一目录中创建了文件f1 创建了一个名为 D2 的空目录,为 d1(目录)中的 f1(文件)创建了软链接(soft link)并将其存储在 d2(目录)中。 我使用的命令:l
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我可以将软链接(soft link)存储在apache文档根目录(/var/www/html)下并将实际文件保留在文档根目录之外的另一个文件系统中吗?我的硬盘中有 4 个文件系统:3 个 NTFS 和
Linux 命令:我正在使用以下命令,该命令返回目录中的最新文件名。 ls -Art | tail -n 1 当我运行此命令时,它会返回最新更改的文件,这实际上是软链接(soft link),我想忽略
红帽 5.5gcc 版本 4.1.2 我有一个名为 lib 的目录,在该目录中我有我们在使用客户 API 时从客户那里获得的所有共享库(大约 30 个)。我们与此 API 链接。 目录结构: /usr
我有一个 WPF 应用程序使用 INotifyPropertyChanged 来指示属性更新。我喜欢它的一点是,它使您能够在不调用所有 setter 代码的情况下发出属性更改信号。当您有两个相互更新的
我在系统的三个不同路径中有相同的共享库。假设路径是 PATH1、PATH2 和 PATH3。 共享库名称是 libmylib.so 现在,如果我在 PATH1 中用损坏的软链接(soft link)替
我是一名优秀的程序员,十分优秀!