gpt4 book ai didi

c# - 对所有实体使用全局查询过滤器

转载 作者:行者123 更新时间:2023-12-04 02:28:35 24 4
gpt4 key购买 nike

我最近发现了全局过滤器,这很棒,因为我的任务是在我的应用程序中实现软删除。
目前我已经这样做了:

// Query filters https://docs.microsoft.com/en-us/ef/core/querying/filters
modelBuilder.Entity<Address>().HasQueryFilter(m => !m.Deleted);
modelBuilder.Entity<Attribute>().HasQueryFilter(m => !m.Deleted);
modelBuilder.Entity<Brand>().HasQueryFilter(m => !m.Deleted);
modelBuilder.Entity<BrandAddress>().HasQueryFilter(m => !m.Deleted);
modelBuilder.Entity<BrandCategory>().HasQueryFilter(m => !m.Deleted);
modelBuilder.Entity<Category>().HasQueryFilter(m => !m.Deleted);
// many more entity types....
所有实体都继承一个 BaseModel看起来像这样:
public class BaseModel
{
public Guid CreatedBy { get; set; }
public Guid UpdatedBy { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateUpdated { get; set; }
public bool Deleted { get; set; }
}
是否可以为继承 BaseModel 的任何类添加查询过滤器? ?
就像是:
modelBuilder.Entity<BaseModel>().HasQueryFilter(m => !m.Deleted);
所以我不会忘记(稍后)为我添加的模型添加查询过滤器?

最佳答案

对于最新的 EF Core 版本(也应该适用于 3.0,对于较早版本的表达式替换应该手动处理,请参阅 ReplacingExpressionVisitor 调用)您可以使用一些 reflection 自动化它(最少的),expression trees IMutableModel.GetEntityTypes 在您的 OnModelCreating方法。这样的事情应该工作:

// define your filter expression tree
Expression<Func<BaseModel, bool>> filterExpr = bm => !bm.Deleted;
foreach (var mutableEntityType in modelBuilder.Model.GetEntityTypes())
{
// check if current entity type is child of BaseModel
if (mutableEntityType.ClrType.IsAssignableTo(typeof(BaseModel)))
{
// modify expression to handle correct child type
var parameter = Expression.Parameter(mutableEntityType.ClrType);
var body = ReplacingExpressionVisitor.Replace(filterExpr.Parameters.First(), parameter, filterExpr.Body);
var lambdaExpression = Expression.Lambda(body, parameter);

// set filter
mutableEntityType.SetQueryFilter(lambdaExpression);
}
}

关于c# - 对所有实体使用全局查询过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65702049/

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