Entity Framework Core
实体框架数据访问技术的轻量型、可扩展、开源、跨平台版本。
50 个问题
在我的应用程序 Base 实体中,我有从基本实体派生的实体:
public abstract class Entity
{
public virtual int Id { get; protected set; }
public virtual string? TenantId { get; protected set; }
}
派生实体:
public class DerivedEntity : Entity
{
//some fields
}
我想为每个实体应用全局查询筛选器
modelBuilder.Entity<DerivedEntity1>().HasQueryFilter(e => e.TenantId == "TenantId");
modelBuilder.Entity<DerivedEntity2>().HasQueryFilter(e => e.TenantId == "TenantId");
modelBuilder.Entity<DerivedEntity3>().HasQueryFilter(e => e.TenantId == "TenantId");
但是应用程序中有许多实体。并且可能会忘记将过滤器应用于新实体。 我将不胜感激您的建议。 Note:此问题总结整理于:Apply common configuration to all entity types ef core 5.0 - Microsoft Q&A
您好,根据您的描述,您希望将通用配置应用于所有实体类型。
您可以在 OnModelCreating 方法中使用一些反射、表达式树和 IMutableModel.GetEntityTypes 。 如以下代码所示
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// add your own configuration here
Expression<Func<Entity, bool>> filterExpr = bm => bm.TenantId=="TenantId";
foreach (var mutableEntityType in modelBuilder.Model.GetEntityTypes())
{
// check if current entity type is child of BaseModel
if (mutableEntityType.ClrType.IsAssignableTo(typeof(Entity)))
{
// 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);
}
}
}
希望这对你有所帮助。
如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。 注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。