From e646ccbb7d2e0010adea72fd5119c9c1f07a46a4 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Thu, 24 Oct 2019 02:10:43 +0800 Subject: [PATCH] update --- 更新日志.md | 6 ++++-- 过滤器.md | 50 +++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/更新日志.md b/更新日志.md index 77c3f75..2785fc1 100644 --- a/更新日志.md +++ b/更新日志.md @@ -1,8 +1,10 @@ 完整版本:年数-月-日-当日版本号,FreeSql、FreeSql.Repository、FreeSql.DbContext 版本号相同。 -## v0.11.2(预告) +## v0.11.2 +- 增加 IFreeSql.GlobalFilter 全局过滤器,[wiki](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8); +- 移除 TableAttribute.SelectFilter 功能; - 修复 MySql/SqlServer CodeFirst 同步结构 bug; > 当表已存在后增加自增列时,产生的脚本不应该包含默认认设置 @@ -428,7 +430,7 @@ class Topic { - 增加 Column.MapType 类型映射,可将 enum 映射为 int/string 等; - 增加 Column.Unique 唯一键,多个属性指定相同的标识,代表联合键,[#42](https://github.com/2881099/FreeSql/issues/42); - 增加 Expression string.Concat,[#39](https://github.com/2881099/FreeSql/issues/39); -- 补充 Expression IEnumerable.Contains 的支持,之前只能数组或IList; +- 补充 Expression IEnumerable\.Contains 的支持,之前只能数组或IList; - 补充 IDbFirst GetTableByDatabase 返回 uk/fk/index 名称,以便迁移; - 补充 MapType/Unique 单元测试; - 优化 PostgreSQL jsonb 类型使用习惯; diff --git a/过滤器.md b/过滤器.md index 4838225..922d80b 100644 --- a/过滤器.md +++ b/过滤器.md @@ -1,8 +1,36 @@ -FreeSql.Repository 实现了过滤器,它不仅是查询时过滤,连删除/修改/插入时都会进行验证,避免数据安全问题。 +FreeSql 基础层实现了 Select/Update/Delete 可设置的全局过滤器功能。 -## 过滤器 +```csharp +public static AsyncLocal TenantId { get; set; } = new AsyncLocal(); -目前过滤器依附在仓储层实现,每个仓储实例都有 IDataFilter 属性,可利用其完成过滤器管理,它是独立的修改后不影响全局。 +fsql.GlobalFilter + .Apply("test1", a => a.Id == TenantId.Value) + .Apply("test2", a => a.Id == 111) + .Apply("test3", a => a.Name == "11"); +``` + +Apply 泛型参数可以设置为任何类型,当使用 Select/Update/Delete 方法时会进行过滤器匹配尝试(try catch): + +- 匹配成功的,将附加 where 条件; +- 匹配失败的,标记下次不再匹配,避免性能损耗; + +如何禁用? + +```csharp +fsql.Select().ToList(); //所有生效 +fsql.Select().DisableGlobalFilter("test1").ToList(); //禁用 test1 +fsql.Select().DisableGlobalFilter().ToList(); //禁用所有 +``` + +fsql.Update/Delete 方法效果同上。 + +# 仓储过滤器 + +FreeSql.Repository 也同样实现了过滤器功能,它不仅是查询时过滤,连删除/修改/插入时都会进行验证,避免数据安全问题。 + +> 注意:仓储的过滤器与 IFreeSql.GlobalFilter 不是一个功能,可以同时生效 + +每个仓储实例都有 IDataFilter 属性,可利用其完成过滤器管理,它是独立的修改后不影响全局。 ```csharp public interface IDataFilter where TEntity : class { @@ -21,11 +49,11 @@ public interface IDataFilter where TEntity : class { ## 临时禁用 ```csharp -using (repos1.DataFilter.Disable("test")) { - //在这段中,repos1 之 test 过滤器失效 +using (repo1.DataFilter.Disable("test")) { + //在这段中,repo1 之 test 过滤器失效 } -//repos1 之 test 过滤器重新生效 +//repo1 之 test 过滤器重新生效 ``` ## 过滤与验证 @@ -81,14 +109,14 @@ public class Song { public string Title { get; set; } } //在控制器使用 -public SongsController(GuidRepository repos1, GuidRepository repos2) { +public SongsController(GuidRepository repo1, GuidRepository repos2) { //在此打断点,调试 } ``` 第一次请求: -repos1.Select.ToSql() +repo1.Select.ToSql() > "SELECT a."Id", a."Title" \r\nFROM "Song" a \r\nWHERE (a."Title" = strftime('%Y-%m-%d %H:%M.%f',datetime(current_timestamp,'localtime')) || 21)" repos2.Select.ToSql() @@ -96,16 +124,16 @@ repos2.Select.ToSql() 第二次请求: -repos1.Select.ToSql() +repo1.Select.ToSql() >"SELECT a."Id", a."Title" \r\nFROM "Song" a \r\nWHERE (a."Title" = strftime('%Y-%m-%d %H:%M.%f',datetime(current_timestamp,'localtime')) || 4)" repos2.Select.ToSql() >"SELECT a."Id" \r\nFROM "xxxx" a" //禁用过滤器 -repos1.DataFilter.Disable("test") +repo1.DataFilter.Disable("test") -repos1.Select.ToSql() +repo1.Select.ToSql() > "SELECT a."Id", a."Title" \r\nFROM "Song" a" 1、注入的变量值在使用时有了动态变化,每次获取时都是新的(Thread.CurrentThread.ManagedThreadId);