上次对EntityFramework.DynamicFilters整体的项目结构有了一个认识,这次我们就通过阅读说明文档,示例项目,和单元测试,来动手构建一个我们的体验项目,通过对动态过滤器的使用,使得我们对过滤功能,在心理上有一个感性的认识,然后再一块深入学习代码内部的机理。

首先,我们来看一下项目说明文档,项目的文档结构说明如下

  

这是开源项目基础内容

  1. CHANGELOG: 一个修改日志,为什么会有修改日志,是对历史发布版本内容的记录,也方便其他使用者,看到修改日志,知道修改了哪些功能,对自己当前的版本有什么影响,要不要升级,等问题.下面是修改日志的内容:

2.LICENSE:这个是做什么用的,打开看的时候,里面是什么法律责任,侵权等问题,去网上查了一下, 在开源项目创建时,还是得仔细考虑一下该用哪种License。要是以后你的项目火了,你就不会因为当初License没选对,而哑巴吃黄连——有苦说不出了。

特别说一下,很多新手(就像我)可能根本没有为自己的项目选择License。没有为项目选择License,意味着他人不能对你的项目进行散发、改动。但他人可以以个人的名义使或以商业用途使用你的软件。另外,如果你将没有License的项目传到了Github上,你就默认接受了Github的服务条款协议——别的用户可以查看或者fork你的项目。

这个网站介绍了各种license的区别:https://choosealicense.com/licenses/

3.Readme.md:第一次打开这个文档是下面这个样子的

去网上找了一下,那么md后缀的文件到底是个什么鬼呢,看这里:

http://www.kuqin.com/shuoit/20141125/343459.html

怎么打开呢,我在vs2015扩展里面,安装了一个插件:

再打开文档的时候,就是这个样子:

左边可以编辑,右边马上就显示了编辑的效果,确实不错

README 应该是介绍code source 的一个概览.其实这个静态文件是有约定成俗的规范.

1.项目介绍

2.代码实现了什么功能?

3.该如何使用? (系统环境参数,部署要素)

4.代码组织架构是什么样的?

5.版本更新重要摘要

如果你的README包括上面的内容,那么当使用者拿到代码,打开README后,基本就知道该如何下手了

下面是创建的体验项目:

第一步:新建控制台应用程序

第二步:通过nuget包管理器,引用:

1.EntityFramework 6.1.2

2.EntityFramework.DynamicFilters.2.6.0

第三步:添加dbContext,model

添加DemoContext:

 public class DemoContext: DbContext{public static Guid CurrentAccountID { get; set; }public DbSet<Account> Accounts { get; set; }public DbSet<BlogEntry> BlogEntries { get; set; }public DemoContext(){Database.SetInitializer(new ContentInitializer<DemoContext>());Database.Log = log => System.Diagnostics.Debug.WriteLine(log);Database.Initialize(false);}protected override void OnModelCreating(DbModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);}}public class ContentInitializer<T> : DropCreateDatabaseAlways<T>where T : DemoContext{protected override void Seed(T context){System.Diagnostics.Debug.Print("Seeding db");//  Seeds 2 accounts with 9 blog entries, 4 of which are deletedvar homer = new Account{UserName = "homer",BlogEntries = new List<BlogEntry>{new BlogEntry { Body="Homer's first blog entry", IsDeleted=false, IsActive=true, StringValue="1"},new BlogEntry { Body="Homer's second blog entry", IsDeleted=false, IsActive=true, StringValue="2"},new BlogEntry { Body="Homer's third blog entry (deleted)", IsDeleted=true, IsActive=true, StringValue="3"},new BlogEntry { Body="Homer's fourth blog entry (deleted)", IsDeleted=true, IsActive=true, StringValue="4"},new BlogEntry { Body="Homer's 5th blog entry (inactive)", IsDeleted=false, IsActive=false, StringValue="5"},new BlogEntry { Body="Homer's 6th blog entry (deleted and inactive)", IsDeleted=true, IsActive=false, StringValue="6"},}};context.Accounts.Add(homer);var bart = new Account{UserName = "bart",BlogEntries = new List<BlogEntry>{new BlogEntry { Body="Bart's first blog entry", IsDeleted=false, IsActive=true, StringValue="7"},new BlogEntry { Body="Bart's second blog entry", IsDeleted=false, IsActive=true, StringValue="8"},new BlogEntry { Body="Bart's third blog entry", IsDeleted=false, IsActive=true, StringValue="9"},new BlogEntry { Body="Bart's fourth blog entry (deleted)", IsDeleted=true, IsActive=true, StringValue="10"},new BlogEntry { Body="Bart's fifth blog entry (deleted)", IsDeleted=true, IsActive=true, StringValue="11"},new BlogEntry { Body="Bart's 6th blog entry (inactive)", IsDeleted=false, IsActive=false, StringValue="12"},new BlogEntry { Body="Bart's 7th blog entry (deleted and inactive)", IsDeleted=true, IsActive=false, StringValue="13"},}};context.Accounts.Add(bart);context.SaveChanges();}}

添加两个实体:

 public class BlogEntry : ISoftDelete{[Key][Required][DatabaseGenerated(DatabaseGeneratedOption.Identity)]public Guid ID { get; set; }public Account Account { get; set; }public Guid AccountID { get; set; }public string Body { get; set; }public bool IsDeleted { get; set; }public int? IntValue { get; set; }public string StringValue { get; set; }public DateTime? DateValue { get; set; }public bool IsActive { get; set; }}public interface ISoftDelete{bool IsDeleted { get; set; }}public class Account{[Key][Required][DatabaseGenerated(DatabaseGeneratedOption.Identity)]public Guid ID { get; set; }public string UserName { get; set; }public ICollection<BlogEntry> BlogEntries { get; set; }/// <summary>/// Column used to verify handling of Entity properties mapped to different conceptual property names./// </summary>[Column("RemappedDBProp")]public bool RemappedEntityProp { get; set; }}

第四步:重写dbcontext里面 protected override void OnModelCreating(DbModelBuilder modelBuilder) 构建动态过渡器

protected override void OnModelCreating(DbModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.Filter("BlogEntryFilter", (BlogEntry b, Guid accountID, bool isDeleted) => (b.AccountID == accountID) && (b.IsDeleted == isDeleted),() => CurrentAccountID, () => false);}

构造了一个过滤器,自动添加条件,查询数据没有被软件删除,且只属于当前登录用户的数据。

调用

var demoContext = new demo.DemoContext();var allBlogEntries = demoContext.BlogEntries.ToList();foreach (BlogEntry blogEntry in allBlogEntries){Console.WriteLine(blogEntry.Body);}

通过阅读:开源项目里面的reademe.md文档,简单的把这个动态过滤器,用到ef实体的自动查询上。

公司用的rafy,当时只是知道怎么用rafy的过滤条件,现在想想应该也跟这种方式差不多,像rafy的幽灵插件,只是rafy想根据条件,配置动态查询条件是否方便,之前都只是单独添加插件,确实没有考虑动态的问题,现在ef的这个动态过滤从全局控制确实挺方便的。

转载于:https://www.cnblogs.com/gdnyfcuso/p/6528776.html

读EntityFramework.DynamicFilters源码_心得_示例演示02相关推荐

  1. PHP大灌篮投篮游戏源码 微信+手机wap源码 带控制_大灌篮游戏源码

    内含详细安装教程,请严格按照文档来安装,顺序错了也会安装不起来. PHP大灌篮游戏源码,投篮游戏源码,手动提现 后台密码自己替换MD5 [完整源码链接] PHP大灌篮投篮游戏源码微信+手机wap源码带 ...

  2. rock带你读CornerNet-lite系列源码(二)

    文章目录 前言 CorNerNet 结构 CornerNet_saccade结构 attention机制 CornerNet_Squeeze结构 构建Groundtruth 热图 focal loss ...

  3. lfi读取php,php LFI读php文件源码以及直接post webshell

    php LFI读php文件源码以及间接post 网站shell 假如如下一个场景 (1) http://vulnerable/fileincl/example1.php?page=intro.php( ...

  4. 读PythonRobotics StateLatticePlanner源码-代码注释篇

    文章目录 2.注释 2.1motion_model.py 2.2model_predictive_trajectory_generator.py 2.3 lookuptable_generator.p ...

  5. Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例

    转载自  Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 第1部分 ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与 ...

  6. python源码剖析 豆瓣_在数据分析师的分析中豆瓣的书那些值得读

    最近总是有人问我有什么书好推荐看看,特烦.但是看到那么多人问,看来挺多人有这个需求,便想了一下,如何通过数据分析找到值得看的书.通过爬取某个标签例如产品,运营获取对应已经打了标签的书,获取书对应的评分 ...

  7. 读懂 Redis 源码,我总结了这7点心得

    作者|Magic Kaito 来源|水滴与银弹 阅读本文大约需要 8 分钟. 你好,我是 Kaito. 用了这么久的 Redis,也翻了很多次源码,经常有人问我到底怎么读 Redis 源码. 一提到读 ...

  8. php仿妙笔阁小说源码带采集_杰奇仿妙笔阁小说网,杰奇仿妙笔阁

    资源来源网络,如果需要授权,请大家更换源码,模块仅供学习,如需商用请购买正版授权 1,安装杰奇程序 2,上传模板文件到对应的目录,有重复就覆盖 3,进入后台->数据维护->数据库升级(第一 ...

  9. tensorflow源码编译教程_极简入门TensorFlow C++源码

    前一段时间,一直在忙框架方面的工作,偶尔也会帮业务同学去优化优化使用TensorFlow的代码,也加上之前看了dmlc/relay,nnvm的代码,觉得蛮有意思,也想分别看下TensorFlow的Gr ...

  10. 寻仙新马源码一键端_强大,腾讯开源前后端接口开发工具!

    APIJSON是啥? APIJSON是一种为API而生的JSON网络传输协议. 为 简单的增删改查.复杂的查询.简单的事务操作 提供了完全自动化的API. 能大幅降低开发和沟通成本,简化开发流程,缩短 ...

最新文章

  1. 一个小框架的形成原理(一)jdom
  2. 函数、返回-Sql Server常用函数之统计、算数、字符串函数-by小雨
  3. 2021春季每日一题【week6 未完结】
  4. Python中定义函数的三种形式
  5. XCTF-高手进阶区:lottery
  6. 如何整一个厉害的产品slogan?
  7. FreeBSD的功能特点
  8. Flutter打包安卓提示请使用 -Xlint:deprecation 重新编译、请使用 -Xlint:unchecked 重新编译
  9. 简单代码大全_VBA爱好者请进:VBA代码宝概述
  10. 堆排序--采用快速排序(利用大堆实现升序,小堆实现降序)
  11. [导入]Linq学习笔记(2.2)——深入DLinq查询
  12. python super()方法的作用_详解python的super()的作用和原理
  13. 第一个小程序demo
  14. 机器学习中的训练集、验证集、测试集;交叉验证方法
  15. 杂项7 - Kali的截图键PrtSc
  16. C++扫雷小游戏(附赠源代码)
  17. 就是要弄懂你之—— 同步 异步 阻塞 非阻塞
  18. 选择排序总结以及排序算法的稳定性
  19. IDEA 新手使用手册
  20. hjr-MUD游戏(二):HTML5-APP客户端编写

热门文章

  1. bootstrap 图标和文字对齐
  2. 手动打印日志及日志等级相关-1
  3. 神界计算机丢失msvcp120.dll,win8 msvcp120.dll丢失怎样修复?计算机中丢失msvcp120.dll处理办法...
  4. 基于SSM疫情信息爬取与分析系统
  5. 算法笔记二分查找题目
  6. rpm和yum的使用
  7. 蓝桥杯包子凑数-完全背包
  8. 规则引擎drools java,spring,spring-boot,drools使用案例
  9. LayaAir UI 组件 # Image 位图、Label 标签
  10. 解决 VMware 新装 CentOS 7.* 连不上网络