dotnetcore / FreeSql

🦄 .NET aot orm, C# orm, VB.NET orm, Mysql orm, Postgresql orm, SqlServer orm, Oracle orm, Sqlite orm, Firebird orm, 达梦 orm, 人大金仓 orm, 神通 orm, 翰高 orm, 南大通用 orm, 虚谷 orm, 国产 orm, Clickhouse orm, DuckDB orm, TDengine orm, QuestDB orm, MsAccess orm.
https://freesql.net
MIT License
4.12k stars 859 forks source link

Includemany的softdelete问题 #1028

Closed ymb27 closed 2 years ago

ymb27 commented 2 years ago

问题描述及重现步骤:

使用了includemany进行贪婪加载后全局设置的softdelete过滤器不起作用,代码如下。


var laneRepos = _unitOfWork.GetRepository<Lane>();
var lane = await laneRepos.Select.Where(a => a.Id == id).IncludeMany(a => a.Cards.Where(b => b.LaneId == a.Id)).ToOneAsync();
...

全局软删除过滤器配置如下。


services.AddFreeRepository(filter => 
                filter.Apply<ISoftDelete>("softdelete", a => a.IsDeleted == false),
                this.GetType().Assembly
);

查询结果如下。 image

数据库使用sql查询结果如下。 image

数据库的具体版本

mssql 2019 - 15.0.4198.2

安装的包

FreeSql.DbContext 2.6.100
FreeSql.Repository 2.6.100
FreeSql.Provider.SqlServer 2.6.100
FreeSql.Extensions.LazyLoading 2.6.100

.net framework/. net core? 及具体版本

.NET 5.0
luoyunchong commented 2 years ago

请换 全局过滤 器。https://github.com/dotnetcore/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8 而不是你现在使用的仓储过滤器。

ZevFung commented 2 years ago

同问

2881099 commented 2 years ago

同问

请换 全局过滤 器。https://github.com/dotnetcore/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8 而不是你现在使用的仓储过滤器。

ZevFung commented 2 years ago

使用仓储过滤器

            services.AddFreeRepository(filter =>
            {
                filter.Apply<IEntitySoftDelete>("SoftDelete", a => a.IsDeleted == 0);
                filter.Apply<IEntityCompany<long>>("TenantQuery", a => a.CompanyId == 1);
            }, this.GetType().Assembly);
private readonly IUserRepository _userRepository;
public AuthService(
            IUserRepository userRepository
        )
        {
            _userRepository.DataFilter.Disable("TenantQuery");
        }

user = await _userRepository.GetAsync(1);

改使用全局过滤器

fsql.GlobalFilter.Apply<IEntitySoftDelete>("SoftDelete", a => a.IsDeleted == 0)
                .Apply<IEntityCompany<long>>("TenantQuery", a => a.CompanyId == 1);

不生效

user = await _userRepository.GetAsync(1);

改成以下生效

user = await _userRepository.Select.DisableGlobalFilter("TenantQuery").WhereDynamic(1).ToOneAsync();

很多地方用到仓储的方法,都得修改。请问有没有什么办法像下面配置就可以使用全局过滤器

_userRepository.DataFilter.Disable("TenantQuery");
2881099 commented 2 years ago

这样才是正确用法:

using (_userRepository.DataFilter.Disable("TenantQuery"))
{
    var user = await _userRepository.GetAsync(1);
}

repo.DataFilter.Disable 可以禁用全局过滤器的,你使用的哪个版本?

ZevFung commented 2 years ago

使用过没生效

using (_userRepository.DataFilter.Disable("TenantQuery"))
{
    var user = await _userRepository.GetAsync(1);
}

freesql 版本1.8.1

2881099 commented 2 years ago

v2.3.100

2881099 commented 2 years ago

升级注意事项:https://github.com/dotnetcore/FreeSql/issues/563

ZevFung commented 2 years ago

感谢,我试下

ZevFung commented 2 years ago

下午好,freesql 版本升级到2.3.106了

Repository.DataFilter 无法禁用 GlobalFilter

using (_userRepository.DataFilter.Disable("TenantQuery"))
{
    var user = await _userRepository.GetAsync(1);
}
ZevFung commented 2 years ago

v2.3.100 存在 GlobalFilter 在 Repository 失效的

升级到2.3.106 Repository.DataFilter 无法禁用 GlobalFilter

2881099 commented 2 years ago

@ZevFung 这个确实无效,等会修复发布

2881099 commented 2 years ago

v3.2.650-preview20220520 版本已发布,10分钟后更新

ZevFung commented 2 years ago

感谢,测试过,已修复