ef core SoftDelete Multi-tenancy 软删除、多租户实现 Global Query Filters
ef core提供了Global Query Filters特性来实现多租户与软删除,收集了一些实现方法。
最简单的例子是微软官方的特性解释。
https://docs.microsoft.com/en-us/ef/core/querying/filters
 modelBuilder.Entity<Post>().HasQueryFilter(p => !p.IsDeleted);
比较全面的实现可参考:
https://gunnarpeipman.com/ef-core-global-query-filters/
需要注意Cache问题:
https://docs.microsoft.com/en-us/ef/core/modeling/dynamic-model
https://spin.atomicobject.com/2019/01/29/entity-framework-core-soft-delete/
https://www.meziantou.net/entity-framework-core-soft-delete-using-query-filters.htm
https://comment-it.co.uk/entity-framework-core-soft-delete-workaround/
其中如果需要扫描model自动注册所有实体,属于是高阶用法
构建Expression的代码难以理解,不便后人维护,不过学习一下对理解lambda表达式的底层还是有帮助的
// 1. Add the IsDeleted property
entityType.GetOrAddProperty("IsDeleted", typeof(bool));
// 2. Create the query filter
var parameter = Expression.Parameter(entityType.ClrType);
// EF.Property<bool>(post, "IsDeleted")
var propertyMethodInfo = typeof(EF).GetMethod("Property").MakeGenericMethod(typeof(bool));
var isDeletedProperty = Expression.Call(propertyMethodInfo, parameter, Expression.Constant("IsDeleted"));
// EF.Property<bool>(post, "IsDeleted") == false
BinaryExpression compareExpression = Expression.MakeBinary(ExpressionType.Equal, isDeletedProperty, Expression.Constant(false));
// post => EF.Property<bool>(post, "IsDeleted") == false
var lambda = Expression.Lambda(compareExpression, parameter);
builder.Entity(entityType.ClrType).HasQueryFilter(lambda);
lambda通过全局函数借助统一的父类实现,当然实际开发中,可以改为接口扫描来做。需要注意多个filter条件需要通过“与”操作一起设置,否则后面设置会覆盖前面的设置。
public void SetGlobalQuery<T>(ModelBuilder builder) where T : BaseEntity
{
    builder.Entity<T>().HasKey(e => e.Id);
    builder.Entity<T>().HasQueryFilter(e => e.TenantId == _tenant.Id);
}
private static IList<Type> GetEntityTypes()
{
    if (_entityTypeCache != null)
    {
        return _entityTypeCache.ToList();
    }
    _entityTypeCache = (from a in GetReferencingAssemblies()
                        from t in a.DefinedTypes
                        where t.BaseType == typeof(BaseEntity)
                        select t.AsType()).ToList();
    return _entityTypeCache;
}
protected override void OnModelCreating(ModelBuilder builder)
{
    var navigation = builder.Entity<ProductCategory>()
                            .Metadata
                            .FindNavigation(nameof(ProductCategory.Products));
    navigation.SetPropertyAccessMode(PropertyAccessMode.Field);
    foreach (var type in GetEntityTypes())
    {
        var method = SetGlobalQueryMethod.MakeGenericMethod(type);
        method.Invoke(this, new object[] { builder });
    }
    base.OnModelCreating(builder);
}
												
											ef core SoftDelete Multi-tenancy 软删除、多租户实现 Global Query Filters的更多相关文章
- ef core实现无感知软删除
		
很多web程序一般的偶不会设计真的物理删除了. 基本上都是在在数据库加一个标记,就得当作已经删除了.同时在查询的时候,过滤已经标记删除的数据 ef core实现软删除是非常简单的,直接在OnModel ...
 - EntityFramework.DynamicFilters 实现软删除和租户过滤
		
EntityFramework.DynamicFilters 实现软删除和租户过滤
 - EF Core中Fluent Api如何删除指定数据表中的行
		
这两天一直在研究在code first下如何删除数据表中的指定行,于是开始搜狗,后来百度,压根就找不到资料,后来一想可能我的搜索关键字有问题,而且ef core命令与ef的命令差不多,于是从这两个方面 ...
 - 深入理解 EF Core:使用查询过滤器实现数据软删除
		
原文:https://bit.ly/2Cy3J5f 作者:Jon P Smith 翻译:王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能会去除一些本人实在不知道如何组织 ...
 - 【EF】Entity Framework Core 软删除与查询过滤器
		
本文翻译自<Entity Framework Core: Soft Delete using Query Filters>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 注意 ...
 - EF Core 实现多租户
		
目录 SAAS 和多租户 多租户数据隔离方案 使用 EF Core 简单实现多租户 单数据库实现 多数据库实现 源代码 参考 SAAS 和多租户 SaaS(软件及服务)区别于其他应用程序的主要特征就是 ...
 - 深入理解 EF Core:EF Core 写入数据时发生了什么?
		
阅读本文大概需要 14 分钟. 原文:https://bit.ly/2C67m1C 作者:Jon P Smith 翻译:王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能 ...
 - EF core 性能调优
		
Entity Framework Core performance tuning – a worked example Last Updated: February 25, 2019 | Create ...
 - DDD Code First 迁移数据实现EF CORE的软删除,值对象迁移配置
		
感谢Jeffcky大佬的博客: EntityFramework Core 2.0全局过滤 (HasQueryFilter) https://www.cnblogs.com/CreateMyself/p ...
 
随机推荐
- centos7 链路聚合+KVM桥接连网
			
一.两个物理网卡做链路聚合(em3,em4) 1)创建team类型的网卡,连接别名为team0,使用的模式为activebackup-主备/loadbalance-负载均衡nmcli con add ...
 - 通过pywin32库来上传文件
			
先来安装:pip install pywin32 辅助定位工具winspy下载地址:https://sourceforge.net/projects/winspyex/ 打开后是这玩意: 按住靶心拖拽 ...
 - SpringCloud gateway (史上最全)
			
疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -25[ 博客园 总入口 ] 前言 ### 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家 ...
 - IT兄弟连 HTML5教程 HTML5表单 新增的表单属性3
			
9 novalidate novalidate是属性规定在提交表单时不应该验证form和input域.novalidate属性适用于的<input>类型有:text.search.url ...
 - js 对 只包含简单类型数据的对象 为元素 组成的数组 进行去重
			
/** * 对于由简单类型数据组成的对象为元素组成的数组进行去重操作 * @params {Array} 需要去重的对象数组 * @returns {Array} 去重后的对象数组 */ functi ...
 - js鼠标滚轮事件上滚下滚判断
			
onmousewheel <script> var scrollFunc = function (e){ //其实我一开始也不知道用啥 //console.log(e)我们可以打印一下 / ...
 - SSM框架之Spring(5)JdbcTemplate及spring事务控制
			
Spring(5)JdbcTemplate及spring事务控制 ##1.JdbcTmeplate 它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装.spring ...
 - 我的第一个CCS工程
			
直接用别人已经弄好的例程,学习创建属于自己的工程,就发现还是有很多问题的: 首先是:1. 想加载头文件到include工程文件夹中却发现总是在Document文件夹中,很是纳闷,在网上搜了搜,发现时路 ...
 - chattr lsattr linux file system attributes - linux 文件系统扩展属性
			
我们使用 linux 文件系统扩展属性,能够对linux文件系统进行进一步保护:从而给文件 赋予一些额外的限制:在有些情况下,能够对我们的系统提供保护: chattr命令用来改变文件属性.这项指令可改 ...
 - add to explorer context menu需不需要勾选
			
添加到鼠标右键菜单,添加以后,可以直接右键文件,直接选择这个软件打开选择的文件,建议勾选