update

28810
2019-10-24 02:10:43 +08:00
parent 66aada3751
commit e646ccbb7d
2 changed files with 43 additions and 13 deletions

@@ -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<T>.Contains 的支持之前只能数组或IList<T>
- 补充 Expression IEnumerable\<T\>.Contains 的支持之前只能数组或IList<T>
- 补充 IDbFirst GetTableByDatabase 返回 uk/fk/index 名称,以便迁移;
- 补充 MapType/Unique 单元测试;
- 优化 PostgreSQL jsonb 类型使用习惯;

@@ -1,8 +1,36 @@
FreeSql.Repository 实现了过滤器,它不仅是查询时过滤,连删除/修改/插入时都会进行验证,避免数据安全问题
FreeSql 基础层实现了 Select/Update/Delete 可设置的全局过滤器功能
## 过滤器
```csharp
public static AsyncLocal<Guid> TenantId { get; set; } = new AsyncLocal<Guid>();
目前过滤器依附在仓储层实现,每个仓储实例都有 IDataFilter 属性,可利用其完成过滤器管理,它是独立的修改后不影响全局。
fsql.GlobalFilter
.Apply<TestAddEnum>("test1", a => a.Id == TenantId.Value)
.Apply<AuthorTest>("test2", a => a.Id == 111)
.Apply<AuthorTest>("test3", a => a.Name == "11");
```
Apply 泛型参数可以设置为任何类型,当使用 Select/Update/Delete 方法时会进行过滤器匹配尝试try catch
- 匹配成功的,将附加 where 条件;
- 匹配失败的,标记下次不再匹配,避免性能损耗;
如何禁用?
```csharp
fsql.Select<TestAddEnum>().ToList(); //所有生效
fsql.Select<TestAddEnum>().DisableGlobalFilter("test1").ToList(); //禁用 test1
fsql.Select<TestAddEnum>().DisableGlobalFilter().ToList(); //禁用所有
```
fsql.Update/Delete 方法效果同上。
# 仓储过滤器
FreeSql.Repository 也同样实现了过滤器功能,它不仅是查询时过滤,连删除/修改/插入时都会进行验证,避免数据安全问题。
> 注意:仓储的过滤器与 IFreeSql.GlobalFilter 不是一个功能,可以同时生效
每个仓储实例都有 IDataFilter 属性,可利用其完成过滤器管理,它是独立的修改后不影响全局。
```csharp
public interface IDataFilter<TEntity> where TEntity : class {
@@ -21,11 +49,11 @@ public interface IDataFilter<TEntity> 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<Song> repos1, GuidRepository<xxxx> repos2) {
public SongsController(GuidRepository<Song> repo1, GuidRepository<xxxx> 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