该篇内容由个人博客点击跳转同步更新!转载请注明出处!

前段时间使用FreeSql作为ORM,写了一个简单的CMS,在这里总结一下其中的使用心得。

仓储配合全局过滤器

1. 统一的删除标志

如:数据库字段 bool IsDeleted,代表删除标志。

需要配合仓储可实现,统一的删除标志,不需要加where(r=>r.deleted==false),取数据时,自动过滤数据。

接口 ISoftDeleteAduitEntity.cs

    public interface ISoftDeleteAduitEntity
{
bool IsDeleted { get; set; }
long? DeleteUserId { get; set; }
DateTime? DeleteTime { get; set; }
}

ConfigureServices通过配置服务,增加全局过滤器,第二个参数,可指定仓储所在的程序集(一个dll,一个项目就是一个程序集(一般一个解决方案下有多个项目,如果仓储写在多个地方,我们可以,把要扫描的程序集写在第二个参数上。))

services.AddFreeRepository(filter =>
{
filter.Apply<ISoftDeleteAduitEntity>("SoftDelete", a => a.IsDeleted == false);
}, GetType().Assembly, typeof(AuditBaseRepository<>).Assembly);

GetType().Assembly 当前项目所在程序集。

typeof(AuditBaseRepository<>).Assembly,为AuditBaseRepository所在程序集,(LinCms.Zero.dll)

2.统一的删除时间,删除人

上文,关于配置删除标志,我们注入其提供好的仓储,会过滤掉isdeleted属性为true的值。

  public class UserService : IUserSevice
{
private readonly BaseRepository<LinUser> _userRepository;
public UserService(BaseRepository<LinUser> userRepository)
{
_userRepository = userRepository;
} public List<LinUser> GetUserList()
{
List<LinUser> users = _userRepository.Select.ToList();
return users;
}
}

那么,我们删除一个用户时,怎么增加删除时间,删除人呢。

public void Delete(int id)
{
_userRepository.Delete(r => r.Id == id);
}

这样能删除,但删除人,删除时间并没有加上去。

这里我们注入AuditBaseRepository,重写父类Delete方法。

private readonly AuditBaseRepository<LinUser> _userRepository;
public UserService(AuditBaseRepository<LinUser> userRepository)
{
_userRepository = userRepository;
} public void Delete(int id)
{
_userRepository.Delete(r => r.Id == id);
}

由于父类并非Virtual类型,这里通过new关键字重写 int Delete(Expression<Func<T, bool>> predicate)方法

public new int Delete(Expression<Func<T, bool>> predicate)
{
if (typeof(ISoftDeleteAduitEntity).IsAssignableFrom(typeof(T)))
{
List<T> items = Orm.Select<T>().Where(predicate).ToList();
return Orm.Update<T>(items)
.Set(a => (a as ISoftDeleteAduitEntity).IsDeleted, true)
.Set(a => (a as ISoftDeleteAduitEntity).DeleteUserId, _currentUser.Id)
.Set(a => (a as ISoftDeleteAduitEntity).DeleteTime, DateTime.Now)
.ExecuteAffrows();
} return base.Delete(predicate);
}

全部重写删除操作,请参考https://github.com/luoyunchong/lin-cms-dotnetcore/blob/master/src/LinCms.Zero/Repositories/AuditBaseRepository.cs

这样固然能实现,但好像包含大量as,IsAssignableFrom(判断T是否继承了ISoftDeleteAduitEntity).

FreeSql配合仓储实现软删除的更多相关文章

  1. 在FreeSQL中实现「触发器」和软删除功能

    前言 最近做新项目,技术栈 AspNetCore + FreeSQL 这个ORM真的好用,文档也很完善,这里记录一下两个有关「触发器」的功能实现 修改实体时记录更新时间 模型代码 我的模型都是基于这个 ...

  2. thinkphp自动完成、软删除 和时间戳

    thinkphp自动完成.软删除 和时间戳 一.总结 自动完成:没有手动赋值的情况下进行手动处理 软删除:实现假删除,可以进行恢复 时间戳:系统支持自动写入创建和更新的时间戳字段 二.thinkphp ...

  3. tp5 model 中的软删除

    model中需use traits\model\SoftDelete; // 数据表中需添加一个 delete_time 字段保存删除时间 namespace app\index\model; use ...

  4. laravel框架总结(九) -- 软删除

    当模型被软删除时,它们并不会真的从数据库中被移除.而是会在模型上设置一个 deleted_at 属性并将其添加到数据库.如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空. ...

  5. 软删除脏数据job笔记

    某次处理一个case,发现线上库里有很多数据有问题.于是决定写一个job来将有问题的数据软删除掉.涉及到的两条SQL语句如下: <select id="loadTSKTVBillDai ...

  6. 关于Domino数据库的软删除

    在Domino的数据库属性的 “高级” 附签(选择文件->数据库->属性),选中“允许软删除”,这样我们就启用了软删除功能,当一个文档没有删除的时候我们可以使用NotesDatabase的 ...

  7. Mysql软删除

    所谓软删除(Soft Deleting),即在删除数据表中的数据时,并不直接将其从数据表中删除,而是将其标志为删除,即在每张表中设置一个删除字段(如:IsDeleted)等,默认情况下其值为0,及未删 ...

  8. 数据的软删除-管理员的CRUD

    数据的“软删除”---把数据真正删除在某些时候会有问题.IsDeleted字段,false表示不删除,而是让用户可以看到,true表示是软删除,用户看不到. 一个表引用另外一张表的时候一定要引用主键. ...

  9. Entity Framework Core 软删除与查询过滤器

    本文翻译自<Entity Framework Core: Soft Delete using Query Filters>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 注意 ...

随机推荐

  1. 洛谷1014 Cantor表

      水题.随便搞搞就过了. //Serene #include<algorithm> #include<iostream> #include<cstring> #i ...

  2. RNN与 LSTM 网络

    循环神经网络(RNN) 人们的每次思考并不都是从零开始的.比如说你在阅读这篇文章时,你基于对前面的文字的理解来理解你目前阅读到的文字,而不是每读到一个文字时,都抛弃掉前面的思考,从头开始.你的记忆是有 ...

  3. LeedCode OJ -- String to Integer (atoi)

    点击打开题目链接 题目意思就是自己实现一个atoi函数,也就是将字符串转换成int型. 关于INT_MAX和INT_MIN, 只是在<limits.h>文件中定义的宏..分别是int型可以 ...

  4. Ui自动化测试框架

    为了提高我们的UI测试效率,我们引用Ui自动化测试框架,这里简单先描述一下,后续会详细补充: 了解一个测试框架,我们就需要了解一下源码,能看懂源码即可: 1.稳定先封装wait EC,电脑性能配置较好 ...

  5. 【JZOJ1611】Dining

    题目描述 农夫JOHN为牛们做了很好的食品,但是牛吃饭很挑食.每一头牛只喜欢吃一些食品和饮料而别的一概不吃.虽然他不一定能把所有牛喂饱,他还是想让尽可能多的牛吃到他们喜欢的食品和饮料. 农夫JOHN做 ...

  6. OpenJudge_1936:All in All

    描述 You have devised a new encryption technique which encodes a message by inserting between its char ...

  7. 阿里云数据库自研产品亮相国际顶级会议ICDE 推动云原生数据库成为行业标准

    4月9日,澳门当地时间下午4:00-5:30,阿里云在ICDE 2019举办了主题为“云时代的数据库”的专场分享研讨会. 本次专场研讨会由阿里巴巴集团副总裁.高级研究员,阿里云智能数据库产品事业部负责 ...

  8. 【机器学习】Iris Data Set(鸢尾花数据集)

    [机器学习]Iris Data Set(鸢尾花数据集) 注:数据是机器学习模型的原材料,当下机器学习的热潮离不开大数据的支撑.在机器学习领域,有大量的公开数据集可以使用,从几百个样本到几十万个样本的数 ...

  9. selenium实现网页截全屏

    from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--headless' ...

  10. SDUT-2772_数据结构实验之串一:KMP简单应用

    数据结构实验之串一:KMP简单应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定两个字符串string1和str ...