1、创建ASP.NET Core Web Applicatoin (MVC)项目,并且使用 Individual User Account

2、创建数据筛选接口 Models->IDataFilter.cs

    public interface IDataFilter
{
string UserName { get; set; }
}

3、创建实体 Models->Book.cs 并继承 IDataFilter接口,并将实体加入到 Data->ApplicatoinDbContext.cs 上下文中.

    public class Book : IDataFilter
{
public int Id { get; set; }
[Display(Name = "书名")]
public string Name { get; set; }
public string UserName { get; set; }
}
    public class ApplicationDbContext : IdentityDbContext
{
public DbSet<Book> Books { get; set; }
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}

4、利用模板创建Book类的 CRUD界面。在 Controllers文件夹上 右键 选择 Add(新增)->Controller(控制器)

  

5、自动生成Book的增删改查之后,我们在这里要做一个细微的修改,因为我们IDataFilter字段 UserName是系统生成的,所以我们要修改两个地方

  将BooksController.cs 下的 Create Action(由于只做演示,没有去修改Update页面)里面的 Bind UserName去掉。修改后结果如下

  并将创建页面 Views->Books->Create.cshtml 中的 UserName 部份备注

  

  在母版页添加Book菜单链接 Views->Shared->_Layout.cshtml

6、打开Nuget管理控制台 迁移数据库,并F5运行,点击Book链接。检查一下程序 有没问题。

Add-Migration Init //创建迁移文件
Update-Database //更新到数据库

7、由于Book实体实现了IDataFilter,UserName我们会通过重写ApplicationDbContext的SaveChanges的实现,进行自动填充用户名.由于要获取登录信息,在ApplicationDbContext中我们需注入 IHttpContextAccessor

    public class ApplicationDbContext : IdentityDbContext
{
private readonly IHttpContextAccessor _httpContextAccessor;
public DbSet<Book> Books { get; set; }
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IHttpContextAccessor httpContextAccessor)
: base(options)
{
_httpContextAccessor = httpContextAccessor;
} public override int SaveChanges()
{
FillDataFilterInfo();
return base.SaveChanges();
}
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
{
FillDataFilterInfo();
return base.SaveChangesAsync(cancellationToken);
}
protected void FillDataFilterInfo() =>
ChangeTracker
.Entries()
.Where(w => w.Entity is IDataFilter && w.State == EntityState.Added)
.ToList()
.ForEach(entry => ((IDataFilter)entry.Entity).UserName = CurrentUserName); private string CurrentUserName => _httpContextAccessor.HttpContext.User?.Identity?.Name;
}

8、验证结果,运行项目,首先注册一个帐号。然后进行创建一本书。最终结果。

9、最后我们来实现数据过滤部份代码,打开 ApplicatonDbContex.cs

添加私有方法DataFilters

        private void DataFilters<T>(ModelBuilder builder)
where T : class
{
builder.Entity<T>().HasQueryFilter(s => ((IDataFilter)s).UserName == CurrentUserName);
}

添加一个静态MethodInfo方法。这里用到返射实现

        private static readonly MethodInfo _dataFiltersMethodInfo = typeof(ApplicationDbContext).GetMethod(nameof(DataFilters), BindingFlags.Instance | BindingFlags.NonPublic);

在重写OnModelCreating ,针对所有实现 IDataFilter的实体添加数据过滤

        protected override void OnModelCreating(ModelBuilder builder)
{
builder.Model
.GetEntityTypes()
.Where(w => typeof(IDataFilter).IsAssignableFrom(w.ClrType))
.ToList().ForEach(entityType =>
{
_dataFiltersMethodInfo
.MakeGenericMethod(entityType.ClrType)
.Invoke(this, new object[] { builder });
});
base.OnModelCreating(builder);
}

10、运行程序,分别用不同的浏览器。注册两个帐号。然后创建几本书。最终结果

完结!第一次写,见谅。

源码地址:https://github.com/CC1027CC/DataFilter

Asp.Net Core 项目 EntityFramework Core 根据登录用户名过滤数据的更多相关文章

  1. [01]从零开始学 ASP.NET Core 与 EntityFramework Core 课程介绍

    从零开始学 ASP.NET Core 与 EntityFramework Core 课程介绍 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新 ...

  2. 从零开始学 ASP.NET Core 与 EntityFramework Core 目录

    从零开始学 ASP.NET Core 与 EntityFramework Core 介绍 我是一个目录,它旨在帮助开发者循序渐进的了解 ASP.NET Core 和 Entity Framework ...

  3. 【jqGrid for ASP.NET MVC Documentation】.学习笔记.7.搜索过滤数据

    1 基础 搜索和过滤功能,是使用确定的条件,查找匹配行数据.jqGrid提供几种搜索模式: Search Dialog 单搜索选项 Search Dialog 多搜索选项 ToolBar Search ...

  4. Django xadmin 根据登录用户过滤数据

    在adminx.py文件对应的的class中添加如下代码: def queryset(self): qs = super(taskAdmin, self).queryset() if self.req ...

  5. Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  6. Asp.Net Core 项目实战之权限管理系统(5) 用户登录

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  7. 【无私分享:ASP.NET CORE 项目实战(第三章)】EntityFramework下领域驱动设计的应用

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在我们 [无私分享:从入门到精通ASP.NET MVC] 系列中,我们其实也是有DDD思想的,但是没有完全的去实现,因为并不是 ...

  8. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  9. Asp.Net Core 项目实战之权限管理系统(0) 无中生有

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

随机推荐

  1. spring mybatis circular reference

    摘要: Error creating bean with name 'XXX': Requested bean is currently in creation: Is there an unreso ...

  2. ASP.NET Core & Docker & Jenkins 零基础持续集成实战

    原文:ASP.NET Core & Docker & Jenkins 零基础持续集成实战 一.本系列教程说明 源代码管理工具:Gogs 持续集成工具:Jenkins 容器:Docker ...

  3. 避免单线程单元 (STA) COM 组件

    默认情况下,ASP.NET 不允许任何 STA COM 组件在页面内运行.若要运行它们,必须在 .aspx 文件内将 ASPCompat=true 属性包含在 @ Page 指令中.这样就将执行用的线 ...

  4. ajax的跨域请求问题:减少options请求

    服务器端在Response Headers里添加字段Access-Control-Max-Age: 86400 , "Access-Control-Max-Age"表明在86400 ...

  5. jquery即点击改

    $(document).on("click",".sp",function(){    var brand_id=$(this).attr("valu ...

  6. Opencv中SVM样本训练、归类流程及实现

    支持向量机(SVM)中最核心的是什么?个人理解就是前4个字--"支持向量",一旦在两类或多累样本集中定位到某些特定的点作为支持向量,就可以依据这些支持向量计算出来分类超平面,再依据 ...

  7. 简明Python3教程 15.异常

    简介 当程序发生意外情况时则产生异常. 例如你需要读一个文件而这个文件并不存在会咋样?又或者是程序运行时你把它误删除了呢? 上述情形通过异常进行处理. 类似的,如果你的程序存在一些非法语句会发生什么呢 ...

  8. sql在单引号的声明标志着嵌套问题

    在sql声明,我们将不可避免地使用嵌套单引号什么时候.但它肯定不是一个直接嵌套,java使用反斜杠做到这一点是不够的.在sql这是做一个单引号逃逸. 例如,下面的例子是展示一个示例存储过程的语句进行查 ...

  9. 在Eclipse安装ADT

    Eclipse 3.4 (Ganymede) 启动 Eclipse,然后选择 Help > Software Updates….在出现的对话框中.单击 Available Software 选项 ...

  10. 潜移默化学会WPF(难点控件treeview)--改造TreeView(CheckBox多选择版本),递归绑定数据

    原文:潜移默化学会WPF(难点控件treeview)--改造TreeView(CheckBox多选择版本),递归绑定数据 目前自己对treeview的感慨很多 今天先讲 面对这种 表结构的数据 的其中 ...