gpt4 book ai didi

c# - 过滤所有查询(试图实现软删除)

转载 作者:太空狗 更新时间:2023-10-29 20:52:40 25 4
gpt4 key购买 nike

我正在尝试在 EF Core 2.0 中使用软删除行为。

public interface ISoftDeleteModel
{
bool IsDeleted { get; set; }
}

创建适当的列和软删除工作正常,但从 DbContext 过滤实体则不然。

我想在上下文中使用查询过滤,但我被卡住了。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
Type entityType;
// ^^^ it contains type of entity, eg. Blog, Post, etc. using
// modelBuilder.Model.GetEntityTypes().First().Name and converting to Type

var entity = modelBuilder.Entity(entityType);
if(entityType.GetInterface("ISoftDeleteModel") != null)
{
// ??? how to access IsDeleted property ???
entity.HasQueryFilter(x => !x.IsDeleted);
}
}

问题很简单——如何访问 IsDeleted 属性?

如果我知道实体的类型,例如。 Post 和 Post 实现的 ISoftDeleteModel 我可以这样做:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>().HasQueryFilter(x => !x.IsDeleted);
}

但我不知道类型。我正在尝试实现简单的事情——所有实现此接口(interface)的模型都会被自动过滤。我错过了什么吗?

最佳答案

无法测试确切的 API,但一般方法是创建一个受约束的泛型方法并通过反射调用它:

public static class EFFilterExtensions
{
public static void SetSoftDeleteFilter(this ModelBuilder modelBuilder, Type entityType)
{
SetSoftDeleteFilterMethod.MakeGenericMethod(entityType)
.Invoke(null, new object[] { modelBuilder });
}

static readonly MethodInfo SetSoftDeleteFilterMethod = typeof(EFFilterExtensions)
.GetMethods(BindingFlags.Public | BindingFlags.Static)
.Single(t => t.IsGenericMethod && t.Name == "SetSoftDeleteFilter");

public static void SetSoftDeleteFilter<TEntity>(this ModelBuilder modelBuilder)
where TEntity : class, ISoftDeleteModel
{
modelBuilder.Entity<TEntity>().HasQueryFilter(x => !x.IsDeleted);
}
}

现在您可以在 OnModelCreating 中使用类似这样的东西:

foreach (var type in modelBuilder.Model.GetEntityTypes())
{
if (typeof(ISoftDeleteModel).IsAssignableFrom(type.ClrType))
modelBuilder.SetSoftDeleteFilter(type.ClrType);
}

关于c# - 过滤所有查询(试图实现软删除),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45096799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com