From 93ea5812812706264fcee590568dd11b40367fe0 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 21 Sep 2022 23:22:46 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20GlobalFilter.ApplyIf?= =?UTF-8?q?=20+=20Repository.DataFilter.DisableAll=20=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E4=B8=8D=E7=94=9F=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 1 + FreeSql.DbContext/FreeSql.DbContext.xml | 18 --- .../Repository/Repository/BaseRepository.cs | 2 +- .../RepositoryTests02.cs | 153 ++++++++++++++++++ FreeSql/Internal/GlobalFilter.cs | 1 + 5 files changed, 156 insertions(+), 19 deletions(-) create mode 100644 FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests02.cs diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 95dd884c..dcad4573 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -446,6 +446,7 @@ namespace base_entity sqss2 = fsql.InsertDict(diclist).AsTable("table1").NoneParameter(false).ToSql(); dic["xxx"] = null; + dic["yyy"] = 111; var sqlupd1 = fsql.UpdateDict(dic).AsTable("table1").WherePrimary("id").ToSql(); var sqlupd2 = fsql.UpdateDict(diclist).AsTable("table1").WherePrimary("id").ToSql(); var sqlupd11 = fsql.UpdateDict(dic).AsTable("table1").WherePrimary("id").NoneParameter(false).ToSql(); diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 26522f10..594fbad3 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -733,15 +733,6 @@ - - - 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 - - - - - - 创建普通数据上下文档对象 @@ -800,14 +791,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs index 5770ed5a..6f697777 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -30,7 +30,7 @@ namespace FreeSql DataFilter.Apply("", filter); AsTable(asTable); - fsql.GlobalFilter.GetFilters().ForEach(gf => + fsql.GlobalFilter.GetAllFilters().ForEach(gf => { (DataFilter as DataFilter)._filtersByOrm.TryAdd(gf.Name, new DataFilter.FilterItemByOrm { diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests02.cs b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests02.cs new file mode 100644 index 00000000..b6a58465 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests02.cs @@ -0,0 +1,153 @@ +using FreeSql.DataAnnotations; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace FreeSql.Tests.DbContext +{ + public class RepositoryTests02 + { + [Fact] + public void TestMethod1() + { + using (IFreeSql fsql = new FreeSql.FreeSqlBuilder() + .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=:memory:") + .UseMonitorCommand(cmd => Trace.WriteLine($"Sql:{cmd.CommandText}"))//监听SQL语句 + .UseAutoSyncStructure(true) //自动同步实体结构到数据库,FreeSql不会扫描程序集,只有CRUD时才会生成表。 + .Build()) + { + fsql.GlobalFilter.ApplyIf("TenantFilter", () => TenantManager.Current > 0, a => a.TenantId == TenantManager.Current); + + fsql.Aop.AuditValue += (_, e) => + { + if (TenantManager.Current > 0 && e.Property.PropertyType == typeof(int) && e.Property.Name == "TenantId") + { + e.Value = TenantManager.Current; + }; + }; + + IBaseRepository resp = fsql.GetRepository(); + resp.Delete(a => a.ID != null); + Assert.True(resp != null); + + + + TenantManager.Current = 1; + + resp.InsertOrUpdate(new User() + { + uname = "zhaoqin", + }); + + resp.InsertOrUpdate(new User() + { + uname = "wanghuan", + }); + long cc = resp.Where(a => a.ID != null).Count(); + Assert.True(cc == 2); + + + + TenantManager.Current = 2; + + resp.InsertOrUpdate(new User() + { + uname = "zhaoqin1", + }); + + resp.InsertOrUpdate(new User() + { + uname = "wanghuan1", + }); + long c = resp.Where(a => a.ID != null).Count(); + Assert.True(c == 2); + + + + TenantManager.Current = 0; + + Assert.True(resp.Where(a => a.ID != null).Count() == 4); + + + //多租户启用,但表达式想取消,这个可以成功 + TenantManager.Current = 2; + long count1 = fsql.Select().DisableGlobalFilter().Count(); + Assert.True(count1 == 4); + + + Console.WriteLine("仓储的过滤器禁止,但不成功."); + //仓储的过滤器禁止,但不成功. + using (resp.DataFilter.DisableAll()) + { + + long count2 = resp.Where(a => a.ID != null).Count(); + + Assert.True(count2 == 4); + } + + } + } + + + public class TenantManager + { + // 注意一定是 static 静态化 + static AsyncLocal _asyncLocal = new AsyncLocal(); + + public static int Current + { + get => _asyncLocal.Value; + set => _asyncLocal.Value = value; + } + } + + public class BaseModel + { + [Column(IsIdentity = true)] + public int? ID { get; set; } + public int TenantId { get; set; } + } + + public class User : BaseModel + { + + public Guid cateId { get; set; } + public Cate cate { get; set; } + + public string uname { get; set; } + public int age { get; set; } + + public List groups { get; set; } = new List(); + } + + public class Cate : BaseModel + { + public string catename { get; set; } + + public List users { get; set; } + } + + public class Group : BaseModel + { + public string groupname { get; set; } + + public List users { get; set; } = new List(); + } + + public class User_Group + { + public Guid UserId { get; set; } + public User user { get; set; } + + public Guid GroupId { get; set; } + public Group group { get; set; } + } + + } +} + diff --git a/FreeSql/Internal/GlobalFilter.cs b/FreeSql/Internal/GlobalFilter.cs index a09fb5c7..8089a3d8 100644 --- a/FreeSql/Internal/GlobalFilter.cs +++ b/FreeSql/Internal/GlobalFilter.cs @@ -85,5 +85,6 @@ namespace FreeSql.Internal public void Remove(string name) => _filters.TryRemove(name ?? throw new ArgumentNullException(nameof(name)), out var _); public List GetFilters() => _filters.Values.Where(a => a.Condition?.Invoke() != false).OrderBy(a => a.Id).ToList(); + public List GetAllFilters() => _filters.Values.OrderBy(a => a.Id).ToList(); } }