ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.net6 EF core 软删除,全局过滤器

2022-07-09 16:32:45  阅读:292  来源: 互联网

标签:core entityType net6 EF filter acceptAllChangesOnSuccess ISoftDelete entry publi


1、新建interface

public interface ISoftDelete
{
    public bool isdeleted { get; set; }
}

2、需要使用到软删除的entity要继承这个interface
3、然后在DBContext的OnModelCreating中为每个继承了ISoftDelete的entity添加过滤器

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    foreach (var entityType in builder.Model.GetEntityTypes())
    {
        if (typeof(ISoftDelete).IsAssignableFrom(entityType.ClrType))
        {
            entityType.AddSoftDeleteQueryFilter();
        }
    }
}
public static class SoftDeleteQueryExtension
{
    public static void AddSoftDeleteQueryFilter(this IMutableEntityType entityData)
    {
        MethodInfo methodToCall = typeof(SoftDeleteQueryExtension).GetMethod(nameof(GetSoftDeleteFilter), BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(entityData.ClrType);
        var filter = methodToCall.Invoke(null, new object[] { });
        entityData.SetQueryFilter((LambdaExpression)filter);
    }
    private static LambdaExpression GetSoftDeleteFilter<TEntity>() where TEntity : class, ISoftDelete
    {
        Expression<Func<TEntity, bool>> filter = x => !x.isdeleted;
        return filter;
    }
}

4、重写save方法

public override int SaveChanges(bool acceptAllChangesOnSuccess)
{
    return base.SaveChanges(acceptAllChangesOnSuccess);
}
public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))
{
    OnBeforeSaving();
    return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
}
private void OnBeforeSaving()
{
    foreach (var entry in ChangeTracker.Entries())
    {
        if (typeof(ISoftDelete).IsAssignableFrom(entry.Entity.GetType()))
        {
            switch (entry.State)
            {
                case EntityState.Deleted:
                    entry.State = EntityState.Modified;
                    entry.CurrentValues["isdeleted"] = true;
                    break;
            }
        }
    }
}

标签:core,entityType,net6,EF,filter,acceptAllChangesOnSuccess,ISoftDelete,entry,publi
来源: https://www.cnblogs.com/hwxing/p/16461184.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有