前言

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

正经事

1. 约定规则

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

 using Microsoft.EntityFrameworkCore.Infrastructure;
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Zxw.Framework.NetCore.DbContextCore;
using Zxw.Framework.NetCore.Models; namespace Zxw.Framework.Website.Models
{
[DbContext(typeof(SqlServerDbContext))]
[Table("SysMenu")]
public class SysMenu:BaseModel<string>
{
[Key]
[Column("SysMenuId")]
public override string Id { get; set; } public string ParentId { get; set; } = String.Empty; [MaxLength()]
public string MenuPath { get; set; } [Required]
[MaxLength()]
public string MenuName { get; set; } [MaxLength()]
public string MenuIcon { get; set; } [Required]
[MaxLength()]
public string Identity { get; set; } [Required]
[MaxLength()]
public string RouteUrl { get; set; } public bool Visiable { get; set; } = true; public bool Activable { get; set; } = true; [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int SortIndex { get; set; }
}
}

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

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

先上代码为敬:

         protected override void OnModelCreating(ModelBuilder modelBuilder)
{
MappingEntityTypes(modelBuilder);
base.OnModelCreating(modelBuilder);
} private void MappingEntityTypes(ModelBuilder modelBuilder)
{
if (string.IsNullOrEmpty(Option.ModelAssemblyName))
return;
var assembly = Assembly.Load(Option.ModelAssemblyName);
var types = assembly?.GetTypes().Where(c=>c.GetCustomAttributes<DbContextAttribute>().Any());
var list = types?.Where(t =>
t.IsClass && !t.IsGenericType && !t.IsAbstract &&
t.GetInterfaces().Any(m =>
m.IsAssignableFrom(typeof(BaseModel<>)) || m.IsAssignableFrom(typeof(BaseViewModel)))).ToList();
if (list != null && list.Any())
{
list.ForEach(t =>
{
var dbContextType = t.GetCustomAttributes<DbContextAttribute>().FirstOrDefault(x=>x.ContextType==GetType());
if (modelBuilder.Model.FindEntityType(t) == null && null!=dbContextType)
modelBuilder.Model.AddEntityType(t);
});
}
}

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

结束语

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

EF Core懒人小技巧之拒绝DbSet的更多相关文章

  1. 懒人小技巧, Toad 常用偷懒方法

    用toad很久了, 感叹它的功能强大的同时整理了一些相关技巧,  有以前在网上看到的也有自己平时用的时候偶尔发现的, 分享一下, 它对用户体验方面做的真的很到位, 通过各种方式来方便用户的操作. 菜鸟 ...

  2. 懒人小工具:T4自动生成Model,Insert,Select,Delete以及导出Excel的方法

    之前写了篇文章,懒人小工具:[自动生成Model,Insert,Select,Delete以及导出Excel的方法](http://www.jianshu.com/p/d5b11589174a),但是 ...

  3. 懒人小工具:T4生成实体类Model,Insert,Select,Delete以及导出Excel的方法

    由于最近公司在用webform开发ERP,用到大量重复机械的代码,之前写了篇文章,懒人小工具:自动生成Model,Insert,Select,Delete以及导出Excel的方法,但是有人觉得这种方法 ...

  4. 懒人小工具:自动生成Model,Insert,Select,Delete以及导出Excel的方法

    在开发的过程中,我们为了节约时间,往往会将大量重复机械的代码封装,考虑代码的复用性,这样我们可以节约很多时间来做别的事情.最近跳槽到一节webform开发的公司,主要是开发自己公司用的ERP.开始因为 ...

  5. 懒人小工具1:winform自动生成Model,Insert,Select,Delete以及导出Excel的方法

       懒人小工具2:T4自动生成Model,Insert,Select,Delete以及导出Excel的方法    github地址:https://github.com/Jimmey-Jiang/J ...

  6. EF Core HasQueryFilter 的小坑

    这是今天在实际项目中遇到的一个问题,Entity Framework Core 2.2 生成了下面的 SQL 语句,INNER JOIN 部分丑陋的 SQL 语句让人无法忍受. SELECT TOP( ...

  7. [翻译] EF Core in Action 关于这本书

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  8. [翻译] 介绍EF Core

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  9. [翻译 EF Core in Action 1.10] 应该在项目中使用EF Core吗?

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

随机推荐

  1. Oracle PL/SQL编程

    一.PL/SQL简介 1.概念:PL/SQL是Oracle在标准SQL语言上的过程性扩展. 2.优点和特性 提高应用程序的运行性能 提供模块化的程序设计功能 允许定义标示符 具有过程语言控制结构 具备 ...

  2. hive Metastore contains multiple versions

    凌晨接到hive作业异常,hive版本为1.2.1,hadoop版本apache 2.7.1,元数据存储在mysql中,异常信息如下: Logging initialized using config ...

  3. javaweb各种框架组合案例(三):maven+spring+springMVC+hibernate

    1.hibernate译为"越冬",指的是给java程序员带来春天,因为java程序员无需再关心各种sql了: 2.hibernate通过java类生成数据库表,通过操作对象来映射 ...

  4. Docker最全教程之MySQL容器化 (二十四)

    前言 MySQL是目前最流行的开源的关系型数据库,MySQL的容器化之前有朋友投稿并且写过此块,本篇仅从笔者角度进行总结和编写. 目录 镜像说明  运行MySQL容器镜像  1.运行MySQL容器  ...

  5. js数字转成金额格式

    本文有以下三个段落 1.方法展示 2.方法说明 3.方法实例 1.方法展示 //将数字转换成金额显示 function toMoney(num){ num = num.toFixed(2); num ...

  6. iOS登录及token的业务逻辑(没怎么用过,看各种文章总结)

    http:是短连接. 服务器如何判断当前用户是否登录? // 1. 如果是即时通信类:长连接. // 如何保证服务器跟客户端保持长连接状态? // "心跳包" 用来检测用户是否在线 ...

  7. HBase 学习之路(四)—— HBase集群环境配置

    一.集群规划 这里搭建一个3节点的HBase集群,其中三台主机上均为Regin Server.同时为了保证高可用,除了在hadoop001上部署主Master服务外,还在hadoop002上部署备用的 ...

  8. C#反射使用时注意BindingFlags的用法

    c#反射查找方法时,默认只能查到public方法.如果想要查找private方法,需要设定BindingFlags. 即: BindingFlags.Public|BindingFlags.Insta ...

  9. Postman接口测试_基本功能

    一.   安装与更新 1.安装的方式 方式1:chrome插件版本:chrome--->设置--->扩展程序: 方式2:native版本(具有更好的扩展性,推荐使用):https://ww ...

  10. 高效 MacBook 工作环境配置,超实用!

    作者:正鹏 & 隃墨 http://www.xialeizhou.com/?p=71 前言 工欲善其事,必先利其器,工具永远都是用来解决问题的,没必要为了工具而工具,一切工具都是为了能快速准确 ...