EF Core懒人小技巧之拒绝DbSet
2023-03-20 15:27:06 时间
前言
最近在项目中使用EF Core的频率越来越高,当项目比较大的时候,疯狂往DbContext中加各种DbSet,你会不会特难受?如果你是一键生成的大佬,那么请忽略本文。本文旨在不写 DbSet,那么就撸起柚(xiu)子干吧...
正经事
1. 约定规则
首先,为了达到偷懒的目的,我们得事先约定些规则,毕竟无规矩不成方圆。具体规则可以自定义,比如我目前的规则就是在数据表对应的实体类加上些特有的Attribute,比如现成的DbContextAttribute,这个Attribute的具体作用请参考MSDN官方文档。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
OK,规则我们约定好了,下面进行下一步。
2. 重写数据库上下文的OnModelCreating方法
先上代码为敬:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
到此,或许已经明白,重要的只有一句:只要在 ModelBuilder.Model 中注册我们的数据表实体类就可以代替万千DbSet了。
结束语
本次分享就到此结束,不妨亲自试试。以上代码可以在我的个人开源项目 【Zxw.Framework.NetCore】中找到,如果本项目对您有帮助,请给个star或者支持下自家土蜂蜜吧,也诚挚欢迎各路大佬提出建议以及批评指正。
相关文章
- 知实效,促增长,第三届媒介力学论坛成功举办
- 10年老台式机4分钟攻破量子加密算法,此前12年无人破解,核心原理来自25年前
- 80岁还嗖嗖改代码!他是Unix命名人,发明“Hello World”,他说解决问题全靠拖
- 探索企业MLOps落地之路,AISummit 全球人工智能技术大会“MLOps最佳实践”专场成功举办
- 突破财务转型挑战,UiPath深度释放蔡司智能制造新潜能
- 如何选择架构中的底层工具?
- 响应式编程的复杂度和简化
- Yann LeCun:大模型方向错了,智力无法接近人类
- 谷歌逆天「夜视」拍照突然火了!完美降噪还能合成3D视角
- 英伟达首席科学家:深度学习硬件的过去、现在和未来
- 承接遗留系统运维工作的经验
- 让学生免费用的Copilot,即将沦为编程考试作弊神器
- 谷歌、DeepMind新研究:归纳偏置如何影响模型缩放?
- 从单体迁移到微服务的十二种方法
- 对于程序员来说,怎样才算是在写有“技术含量”的代码?
- 商务部回应EDA出口制裁、小天才确认违规App将永不上架、TypeScript4.8正式版即将发布 | T资讯
- 安全架构设计的方法论
- 被视为“救世主”的架构师,普遍缺失了哪些基础能力?
- 我给新手程序员的实用建议
- 秋招算法岗卷上天?大厂技术岗缩减70%!