前言
最近在項目中使用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 }
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 }
到此,或許已經明白,重要的只有一句:只要在 ModelBuilder.Model 中注冊我們的數據表實體類就可以代替萬千DbSet了。
結束語
本次分享就到此結束,不妨親自試試。以上代碼可以在我的個人開源項目 【Zxw.Framework.NetCore】中找到,如果本項目對您有幫助,請給個star或者支持下自家土蜂蜜吧,也誠摯歡迎各路大佬提出建議以及批評指正。