将通用配置应用于所有实体类型 ef core 5.0

Jack J Jun 24,616 信誉分 Microsoft 供应商
2024-01-30T08:53:17.67+00:00

在我的应用程序 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

Entity Framework Core
Entity Framework Core
实体框架数据访问技术的轻量型、可扩展、开源、跨平台版本。
50 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Hui Liu-MSFT 48,586 信誉分 Microsoft 供应商
    2024-01-30T09:44:54.9666667+00:00

    您好,根据您的描述,您希望将通用配置应用于所有实体类型。

    您可以在 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);  
                    }  
                }  
            }  
    
    

    希望这对你有所帮助。

    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。 注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。