• EF Core懒人小技巧之拒绝DbSet


    前言

    最近在项目中使用EF Core的频率越来越高,当项目比较大的时候,疯狂往DbContext中加各种DbSet,你会不会特难受?如果你是一键生成的大佬,那么请忽略本文。本文旨在不写 DbSet,那么就撸起柚(xiu)子干吧...

    正经事

    1. 约定规则

    首先,为了达到偷懒的目的,我们得事先约定些规则,毕竟无规矩不成方圆。具体规则可以自定义,比如我目前的规则就是在数据表对应的实体类加上些特有的Attribute,比如现成的DbContextAttribute,这个Attribute的具体作用请参考MSDN官方文档。

     1 using Microsoft.EntityFrameworkCore.Infrastructure;
     2 using System;
     3 using System.ComponentModel.DataAnnotations;
     4 using System.ComponentModel.DataAnnotations.Schema;
     5 using Zxw.Framework.NetCore.DbContextCore;
     6 using Zxw.Framework.NetCore.Models;
     7 
     8 namespace Zxw.Framework.Website.Models
     9 {
    10     [DbContext(typeof(SqlServerDbContext))]
    11     [Table("SysMenu")]
    12     public class SysMenu:BaseModel<string>
    13     {
    14         [Key]
    15         [Column("SysMenuId")]
    16         public override string Id { get; set; }
    17 
    18         public string ParentId { get; set; } = String.Empty;
    19 
    20         [MaxLength(2000)]
    21         public string MenuPath { get; set; }
    22 
    23         [Required]
    24         [MaxLength(20)]
    25         public string MenuName { get; set; }
    26 
    27         [MaxLength(50)]
    28         public string MenuIcon { get; set; }
    29 
    30         [Required]
    31         [MaxLength(100)]
    32         public string Identity { get; set; }
    33 
    34         [Required]
    35         [MaxLength(200)]
    36         public string RouteUrl { get; set; }
    37 
    38         public bool Visiable { get; set; } = true;
    39 
    40         public bool Activable { get; set; } = true;
    41 
    42         [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    43         public int SortIndex { get; set; }
    44     }
    45 }
    View Code

    OK,规则我们约定好了,下面进行下一步。

    2. 重写数据库上下文的OnModelCreating方法

    先上代码为敬:

     1         protected override void OnModelCreating(ModelBuilder modelBuilder)
     2         {
     3             MappingEntityTypes(modelBuilder);
     4             base.OnModelCreating(modelBuilder);
     5         }
     6 
     7         private void MappingEntityTypes(ModelBuilder modelBuilder)
     8         {
     9             if (string.IsNullOrEmpty(Option.ModelAssemblyName))
    10                 return;
    11             var assembly = Assembly.Load(Option.ModelAssemblyName);
    12             var types = assembly?.GetTypes().Where(c=>c.GetCustomAttributes<DbContextAttribute>().Any());
    13             var list = types?.Where(t =>
    14                 t.IsClass && !t.IsGenericType && !t.IsAbstract &&
    15                 t.GetInterfaces().Any(m =>
    16                     m.IsAssignableFrom(typeof(BaseModel<>)) || m.IsAssignableFrom(typeof(BaseViewModel)))).ToList();
    17             if (list != null && list.Any())
    18             {
    19                 list.ForEach(t =>
    20                 {
    21                     var dbContextType = t.GetCustomAttributes<DbContextAttribute>().FirstOrDefault(x=>x.ContextType==GetType());
    22                     if (modelBuilder.Model.FindEntityType(t) == null && null!=dbContextType)
    23                         modelBuilder.Model.AddEntityType(t);
    24                 });
    25             }
    26         }
    View Code

    到此,或许已经明白,重要的只有一句:只要在 ModelBuilder.Model 中注册我们的数据表实体类就可以代替万千DbSet了

    结束语

    本次分享就到此结束,不妨亲自试试。以上代码可以在我的个人开源项目 【Zxw.Framework.NetCore】中找到,如果本项目对您有帮助,请给个star或者支持下自家土蜂蜜吧,也诚挚欢迎各路大佬提出建议以及批评指正。

  • 相关阅读:
    ACTIVE OBJECT 模式
    Node.js
    WordPress — 突破性能瓶颈,使用 WordPress 站群做 SEO 推广
    HttpRequest.Item 属性 和 HttpRequest.QueryString 属性的区别!
    Regex.Replace 方法的性能!(090625最新修改)
    FACTORY 模式
    Indexof String By Byte[]
    [11]DIP:依赖倒置原则
    C#.Net Winform skin 皮肤 大全(转)
    C# 情缘
  • 原文地址:https://www.cnblogs.com/zengxw/p/11249689.html
Copyright © 2020-2023  润新知