6.1K Star 11.8K Fork 4K

GVPdotNET China / Furion

 / 详情

[问题] 👀 全局筛选器 没有执行,使用Furion源码调试过,

已完成
成员
创建于  
2021-01-20 23:16

Furion 版本号

哪个版本号?
最新版本 1.10.8

Web 项目类型

  • WebApi
  • Mvc

描述你的问题

发生了什么?
上下文中 全局筛选器 没有执行

异常堆栈信息

异常堆栈是什么?
没有异常

代码或代码仓库

什么代码导致?
public sealed class AbcDbContext : AppDbContext,IModelBuilderFilter
{
public AbcDbContext(DbContextOptions options) : base(options)
{
EnabledEntityChangedListener = true;

    }

    //public DbSet<AutidLog> AutidLogs { get; set; }

    #region 全局筛选器
    public void OnCreated(ModelBuilder modelBuilder, EntityTypeBuilder entityBuilder, DbContext dbContext, Type dbContextLocator)
    {
       //此方法没有执行
    }

    public void OnCreating(ModelBuilder modelBuilder, EntityTypeBuilder entityBuilder, DbContext dbContext, Type dbContextLocator)
    {
    //此方法没有执行
        var expression = BuilderIsDeleteLambdaExpression(entityBuilder);
        if (expression == null) return;

        entityBuilder.HasQueryFilter(expression);
    }

    /// <summary>
    /// 构建 u => EF.Property<bool>(u, "IsDeleted") == false 表达式
    /// </summary>
    /// <param name="entityBuilder"></param>
    /// <returns></returns>
    private LambdaExpression BuilderIsDeleteLambdaExpression(EntityTypeBuilder entityBuilder)
    {
        // 获取实体构建器元数据
        var metadata = entityBuilder.Metadata;
        if (metadata.FindProperty(nameof(Entity.IsDeleted)) == null) return default;

        // 创建表达式元素
        var parameter = Expression.Parameter(metadata.ClrType, "u");
        var properyName = Expression.Constant(nameof(Entity.IsDeleted));
        var propertyValue = Expression.Constant(false);

        // 构建表达式 u => EF.Property<bool>(u, "IsDeleted") == false
        var expressionBody = Expression.Equal(Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(bool) }, parameter, properyName), propertyValue);
        var expression = Expression.Lambda(expressionBody, parameter);
        return expression;
    }
    #endregion

通过挂Furion源码调试,发现 此代码没有执行 AppDbContextBuilder.cs 461行

// 添加全局筛选器
if (entityCorrelationType.HasImplementedRawGeneric(typeof(IPrivateModelBuilderFilter)))
{
result.ModelBuilderFilterTypes.Add(entityCorrelationType);

                        // 判断是否是 DbContext 类型,
                        if (typeof(DbContext).IsAssignableFrom(entityCorrelationType))
                        {
                            // 判断是否已经注册了上下文并且是否等于当前上下文
                            if (Penetrates.DbContextWithLocatorCached.Values.Contains(entityCorrelationType) && entityCorrelationType == dbContext.GetType())
                            {
                                result.ModelBuilderFilterInstances.Add(dbContext as IPrivateModelBuilderFilter);
                            }
                        }
                        else result.ModelBuilderFilterInstances.Add(Activator.CreateInstance(entityCorrelationType) as IPrivateModelBuilderFilter);
                    }

数据库信息

  • xSqlite
  • SqlServer
  • Mysql
  • Oracle
  • PGSql
  • Firebird
  • Cosmos

期待结果

期待的结果是?
问题解决

评论 (3)

1024 创建了任务
1024 负责人设置为百小僧
1024 关联仓库设置为百小僧/Furion
1024 添加了
 
漏洞
标签
1024 添加了
 
建议
标签
1024 添加了
 
优先
标签
1024 修改了描述
1024 修改了描述
展开全部操作日志

创建一个临时仓库,还原这个错误出来,我新项目,pear,都没问题。

百小僧 移除了
 
漏洞
标签
百小僧 移除了
 
优先
标签
百小僧 移除了
 
建议
标签
百小僧 添加了
 
疑问
标签
百小僧 添加了
 
无法重现
标签
百小僧 添加了
 
无法实现
标签
百小僧 关联分支设置为master
百小僧 里程碑设置为Furion 2021
百小僧 任务状态待办的 修改为进行中
百小僧 任务状态进行中 修改为已完成

无法重现,先关闭issue。

我后来发现是 再 上下文的类上面使用了 SkipScan ,然后跳过了!!! :scream:

百小僧 关联分支master 修改为未关联

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
974299 monksoul 1578937227 1883684 co1024 1600418760
C#
1
https://gitee.com/dotnetchina/Furion.git
git@gitee.com:dotnetchina/Furion.git
dotnetchina
Furion
Furion

搜索帮助