zoukankan      html  css  js  c++  java
  • Asp.Net Core 项目 EntityFramework Core 根据登录用户名过滤数据

     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

  • 相关阅读:
    hdu 4946 Area of Mushroom(凸包)
    uva 10065 (凸包+求面积)
    hdu 3934&&poj 2079 (凸包+旋转卡壳+求最大三角形面积)
    Codeforces Round #237 (Div. 2) B题模拟题
    Codeforces Round #237 (Div. 2) A
    zoj 1377 || poj 1228 Grandpa's Estate (看了题解,待解决)
    poj 1584 看懂题意----待解决
    Codeforces Round #249 (Div. 2) C题,模拟画图 ----未解决!
    Codeforces Round #249 (Div. 2)B(贪心法)
    MMORPG大型游戏设计与开发(客户端架构 part3 of vegine)
  • 原文地址:https://www.cnblogs.com/cc1027cc/p/11098437.html
Copyright © 2011-2022 走看看