前言

最近在项目中使用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. 不仅仅是百万级TCP长连接框架 t-io

    t-io: 不仅仅是百万级TCP长连接框架 t-io是基于jdk aio实现的易学易用.稳定.性能强悍.将多线程运用到极致.内置功能丰富的即时通讯框架(广义上的即时通讯,并非指im),字母 t 寓意t ...

  2. face='Webdings' 的字体对照表

    刚才研究动网论坛代码,发现一个页面提示标记 i 感觉很神奇,看了半天才明白原来是一种叫“Webdings”的字体,其实很简单,只需要<font face='webdings' size=&quo ...

  3. 【spring boot】application.properties官方完整文档

    官方地址: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/ 进入搜索: Appendice ...

  4. Python装饰器和回调函数

    1.装饰器 装饰器用来实现一种切面功能,即一些函数在调用前都必须实现的功能,比如用户是否登录,用户是否有权限这类需求,都很容易由装饰器来实现. import functools def log(fun ...

  5. Exceptionless(二) - 使用进阶

    Exceptionless(二) - 使用进阶 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/11100563.html 官网 ...

  6. pytorch实现yolov3(3) 实现forward

    之前的文章里https://www.cnblogs.com/sdu20112013/p/11099244.html实现了网络的各个layer. 本篇来实现网络的forward的过程. 定义网络 cla ...

  7. idea+mvc项目转换小记

    经过大家协商,决定还是紧跟时代潮流,把项目转到idea下,并且重新组织项目结构.项目环境原本为myeclipse+maven+springMVC,由于本人提议的boot+cloud变化太大,成本巨大, ...

  8. 使用CocoaPods创建自己的私有库-iOS组件化第一步

    目前iOS组件化常用的解决方案是Pod+路由+持续集成,通常架构设计完成后第一步就是将原来工程里的模块按照架构图分解为一个个独立的pod工程(组件),今天我们就来看看如何创建一个Pod私有库. 新建: ...

  9. HDU 1811:Rank of Tetris(并查集+拓扑排序)

    http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description   自从Lele开发了Rating系 ...

  10. c++最大公约数

    C++辗转相除法求出最大公因数 样例输入 6 9 样例输出 3 程序 #include <stdio.h> using namespace std; int gcd(int m,int n ...